@vibgrate/cli 2026.721.3 → 2026.722.1

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 (65) hide show
  1. package/DOCS.md +185 -0
  2. package/README.md +2 -1
  3. package/dist/baseline-J44M7MWP.js +7 -0
  4. package/dist/{baseline-37G4TINM.js.map → baseline-J44M7MWP.js.map} +1 -1
  5. package/dist/chunk-2EVQKZTO.js +696 -0
  6. package/dist/chunk-2EVQKZTO.js.map +1 -0
  7. package/dist/chunk-6CXTPC74.js +234 -0
  8. package/dist/chunk-6CXTPC74.js.map +1 -0
  9. package/dist/chunk-CRAMOEBE.js +675 -0
  10. package/dist/chunk-CRAMOEBE.js.map +1 -0
  11. package/dist/chunk-CS37OBE3.js +861 -0
  12. package/dist/chunk-CS37OBE3.js.map +1 -0
  13. package/dist/chunk-CT5BS56U.js +23 -0
  14. package/dist/chunk-CT5BS56U.js.map +1 -0
  15. package/dist/{chunk-5PLKADD6.js → chunk-EXQV26MF.js} +4 -3
  16. package/dist/chunk-EXQV26MF.js.map +1 -0
  17. package/dist/chunk-GGJZA3Q6.js +961 -0
  18. package/dist/chunk-GGJZA3Q6.js.map +1 -0
  19. package/dist/chunk-JBXNQCGE.js +484 -0
  20. package/dist/chunk-JBXNQCGE.js.map +1 -0
  21. package/dist/chunk-JFGYT6BI.js +32 -0
  22. package/dist/chunk-JFGYT6BI.js.map +1 -0
  23. package/dist/{chunk-JLRF5TFA.js → chunk-JSNHZCIV.js} +42 -71
  24. package/dist/chunk-JSNHZCIV.js.map +1 -0
  25. package/dist/chunk-JYS4OBN2.js +148 -0
  26. package/dist/chunk-JYS4OBN2.js.map +1 -0
  27. package/dist/chunk-K3SLGULW.js +50 -0
  28. package/dist/chunk-K3SLGULW.js.map +1 -0
  29. package/dist/chunk-LEPTUB4H.js +108 -0
  30. package/dist/chunk-LEPTUB4H.js.map +1 -0
  31. package/dist/{chunk-IKJBELUV.js → chunk-PY3DNX5H.js} +4 -29
  32. package/dist/chunk-PY3DNX5H.js.map +1 -0
  33. package/dist/{chunk-ELUFCQDR.js → chunk-VXT6LUGP.js} +240 -2519
  34. package/dist/chunk-VXT6LUGP.js.map +1 -0
  35. package/dist/chunk-WNIIKCNF.js +972 -0
  36. package/dist/chunk-WNIIKCNF.js.map +1 -0
  37. package/dist/chunk-XKXKWYJF.js +417 -0
  38. package/dist/chunk-XKXKWYJF.js.map +1 -0
  39. package/dist/cli.js +2479 -1234
  40. package/dist/cli.js.map +1 -1
  41. package/dist/fs-KCABDURV.js +3 -0
  42. package/dist/fs-KCABDURV.js.map +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.js +8 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/interactive-736PBC7J.js +820 -0
  47. package/dist/interactive-736PBC7J.js.map +1 -0
  48. package/dist/mcp-tools-I6PME3AV.js +3 -0
  49. package/dist/mcp-tools-I6PME3AV.js.map +1 -0
  50. package/dist/parse-worker.js +2 -1
  51. package/dist/parse-worker.js.map +1 -1
  52. package/dist/session-POJUDFPH.js +6 -0
  53. package/dist/session-POJUDFPH.js.map +1 -0
  54. package/dist/session-store-W5RZZHA3.js +3 -0
  55. package/dist/session-store-W5RZZHA3.js.map +1 -0
  56. package/dist/stream-json-Q2JGWPHB.js +65 -0
  57. package/dist/stream-json-Q2JGWPHB.js.map +1 -0
  58. package/dist/ui-HOVOPWMX.js +4 -0
  59. package/dist/ui-HOVOPWMX.js.map +1 -0
  60. package/package.json +1 -1
  61. package/dist/baseline-37G4TINM.js +0 -6
  62. package/dist/chunk-5PLKADD6.js.map +0 -1
  63. package/dist/chunk-ELUFCQDR.js.map +0 -1
  64. package/dist/chunk-IKJBELUV.js.map +0 -1
  65. package/dist/chunk-JLRF5TFA.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/cli-invocation.ts","../src/engine/discover.ts","../src/engine/limits.ts","../src/engine/module-resolver.ts","../src/engine/ids.ts","../src/engine/tests.ts","../src/engine/scip.ts","../src/engine/rng.ts","../src/engine/analyze.ts","../src/engine/coverage.ts","../src/engine/facts.ts","../src/grounding/pack.ts","../src/engine/grounding.ts","../src/schema.ts","../src/engine/pool.ts","../src/engine/resolve.ts","../src/engine/ts-resolver.ts","../src/engine/epistemic.ts","../src/engine/build.ts","../src/engine/report.ts","../src/engine/html.ts","../src/engine/artifacts.ts","../src/engine/load.ts","../src/engine/verify.ts","../src/util/exit.ts","../src/engine/freshness.ts","../src/engine/graph-model.ts","../src/engine/paths.ts","../src/engine/test-query.ts","../src/engine/models.ts","../src/reporting/utils/gitignore.ts","../src/reporting/regions.ts","../src/reporting/commands/dsn.ts","../src/reporting/credentials.ts","../src/reporting/utils/compact-evidence.ts","../src/reporting/utils/compact-artifact.ts","../src/reporting/utils/upload.ts","../src/reporting/commands/push.ts","../src/mcp/vuln-data.ts","../src/mcp/attribution.ts","../src/engine/tokens.ts","../src/engine/selection-weights.ts","../src/engine/select.ts","../src/engine/quality.ts","../src/engine/hosted.ts","../src/engine/hosted-cache.ts","../src/mcp/response.ts","../src/engine/literal-scan.ts","../src/engine/search.ts","../src/mcp/tools.ts","../src/install/content.ts","../src/install/registry.ts","../src/engine/refresh.ts"],"names":["fs","path","fs2","rel","walk","fs3","path3","fs4","enclosing","nodeId","fs5","path4","resolve","path5","mod","sep","unresolved","normalize","add","path6","path7","fs6","cached","path8","fs7","fs8","path9","fs9","Graph","path10","fs10","os2","path11","fs11","path12","fs12","path13","path14","os3","fs13","gzip","chalk","Command","path15","path16","fs14","full","chunk","path17","fs15","obj","fs16","path18","os4","path19","toPosix","fs17","posix","os5","path20","path21","fs19"],"mappings":"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","file":"chunk-VXT6LUGP.js","sourcesContent":["import * as fs from 'node:fs';\nimport { execFileSync } from 'node:child_process';\n\n/**\n * How the user should re-invoke this CLI in a \"next step\" hint.\n *\n * A user who ran `npx @vibgrate/cli scan` has no *persistent* `vg` (or\n * `vibgrate`) on PATH, so a hint like `vg install` or `vg login` would fail for\n * them once the run ends. We answer the practical question \"what will actually\n * run this CLI for this user again?\" by checking whether an *installed* copy of\n * our binary is reachable on PATH:\n *\n * installed `vg` → `vg` (the normal installed case)\n * installed `vibgrate` → `vibgrate` (alias present, `vg` shadowed)\n * neither → `npx @vibgrate/cli` (npx / not installed globally)\n *\n * \"Installed\" is the key qualifier: `npx` prepends its own throwaway\n * `_npx/<hash>/node_modules/.bin` to PATH for the run, so `which vg` finds a `vg`\n * that is genuinely ours yet gone the moment the process exits. That ephemeral\n * binary is excluded (see {@link isEphemeralNpxBinary}) so npx users get the npx\n * form, not a `vg` they can't call again.\n *\n * This is deliberately the same ladder `detectServeLaunch` uses for the MCP\n * launch command — the underlying question (\"is an installed `vg` ours?\") is\n * identical.\n */\n\n/** The npx form that always works without a global install. */\nexport const NPX_INVOCATION = 'npx @vibgrate/cli';\n\n/**\n * Locate `cmd` on PATH, returning its resolved path or null. Best-effort: a\n * missing command or an unavailable `which`/`where` both yield null.\n */\nexport function whichOnPath(cmd: string): string | null {\n try {\n const out = execFileSync(process.platform === 'win32' ? 'where' : 'which', [cmd], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .trim()\n .split(/\\r?\\n/)[0];\n return out || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Does this PATH entry launch *this* package? Symlink installs resolve into a\n * `…/@vibgrate/cli/…` directory; script shims (pnpm/bun/yarn, Windows .cmd)\n * reference the package path in their first bytes. Best-effort: unreadable or\n * unrecognisable entries count as foreign, which only makes callers pick a safer\n * fallback.\n */\nexport function isOwnBinary(binPath: string): boolean {\n try {\n const real = fs.realpathSync(binPath);\n if (/[\\\\/]@vibgrate[\\\\/]cli[\\\\/]/.test(real)) return true;\n const head = fs.readFileSync(real, { encoding: 'utf8' }).slice(0, 2048);\n return head.includes('@vibgrate/cli') || head.includes('vibgrate');\n } catch {\n return false;\n }\n}\n\n/**\n * Is this resolved binary an *ephemeral* npx-cache entry rather than a persistent\n * install? `npx @vibgrate/cli …` unpacks the package into an npm `_npx/<hash>/`\n * cache directory and prepends its `node_modules/.bin` to PATH for the duration\n * of the run — so `which vg` finds a `vg` that is *ours* yet vanishes the instant\n * the process exits. Treating that as an installed `vg` is exactly what made the\n * post-scan hints tell npx users to run `vg login`/`vg push`, commands they have\n * no `vg` on PATH for. npm's cache segment is `_npx` on every platform; we test\n * the raw PATH entry and its realpath (symlink shims resolve into the same tree).\n */\nexport function isEphemeralNpxBinary(binPath: string): boolean {\n const NPX_SEGMENT = /[\\\\/]_npx[\\\\/]/;\n if (NPX_SEGMENT.test(binPath)) return true;\n try {\n return NPX_SEGMENT.test(fs.realpathSync(binPath));\n } catch {\n return false;\n }\n}\n\n/**\n * Does this PATH entry launch *this* CLI in a way that will still work after the\n * current process exits? True only for a persistent install of our package — an\n * ephemeral npx-cache binary does not count, because the user cannot re-invoke it\n * by name. This is the predicate \"next step\" hints and the MCP launch command\n * must use, not {@link isOwnBinary} alone.\n */\nexport function isInstalledOwnBinary(binPath: string): boolean {\n return isOwnBinary(binPath) && !isEphemeralNpxBinary(binPath);\n}\n\nlet cached: string | undefined;\n\n/**\n * The command prefix a user should type to re-run this CLI (see module doc).\n * Memoized per-process: PATH does not change mid-run, and each call would\n * otherwise spawn `which`. Pass `which` to override lookup in tests, which also\n * bypasses the cache.\n */\nexport function resolveCliInvocation(which?: (cmd: string) => string | null): string {\n if (!which && cached !== undefined) return cached;\n const lookup = which ?? whichOnPath;\n\n const vg = lookup('vg');\n let result: string;\n if (vg && isInstalledOwnBinary(vg)) {\n result = 'vg';\n } else {\n const vibgrate = lookup('vibgrate');\n result = vibgrate && isInstalledOwnBinary(vibgrate) ? 'vibgrate' : NPX_INVOCATION;\n }\n\n if (!which) cached = result;\n return result;\n}\n\n/** Reset the memoized invocation. Test-only. */\nexport function resetCliInvocationCache(): void {\n cached = undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport ignore, { type Ignore } from 'ignore';\nimport { langForExtension, langById, type LanguageDef } from './languages.js';\n\n/**\n * Deterministic file discovery.\n *\n * Respects `.gitignore` (including nested ones), explicit config excludes, and a\n * built-in SKIP_DIRS set consistent with the scanner. Results are returned\n * sorted by relative POSIX path so the build is order-independent of the\n * filesystem.\n */\n\n// Directories never worth walking — dependency trees, build output, and\n// VCS/IDE metadata. Kept aligned with the scanner's skip list (core-open\n// `utils/fs.ts` SKIP_DIRS): the engine stays self-contained (no runtime\n// import), and `test/discover-skips.test.ts` asserts this set covers the\n// scanner's, so the graph can never index a package folder the scanner\n// already decided is third-party.\nexport const SKIP_DIRS = new Set<string>([\n // Version control, IDE & tool metadata\n '.git', '.svn', '.hg',\n '.idea', '.vscode', '.vs',\n '.vibgrate', '.wrangler', '.turbo', '.cache',\n // JavaScript / Node — installed dependency trees\n 'node_modules', 'bower_components', 'jspm_packages', 'web_modules',\n '.pnpm-store', '.yarn',\n // JS/TS meta-framework & bundler build output\n '.next', '.nuxt', '.output', '.svelte-kit', '.astro',\n '.vercel', '.netlify', '.angular', '.parcel-cache', '.docusaurus',\n 'storybook-static',\n // Generic build / dist / coverage output\n 'dist', 'build', 'out', 'coverage',\n // Vendored third-party source trees\n 'vendor', 'Pods', 'Carthage',\n // Python — virtualenvs & tool caches\n '.venv', 'venv', 'virtualenv', '.tox', '.nox',\n '__pycache__', '.mypy_cache', '.pytest_cache', '.ruff_cache',\n '.eggs', '.ipynb_checkpoints',\n // Ruby\n '.bundle',\n // Rust / Maven / sbt / Clojure — all build into target/\n 'target',\n // JVM (Gradle / Maven) & .NET build output\n '.gradle', 'bin', 'obj', 'TestResults',\n // Swift / Xcode\n '.build', '.swiftpm', 'DerivedData',\n // Dart / Flutter\n '.dart_tool',\n // Elixir / Erlang\n '_build', 'deps',\n // Haskell (Cabal / Stack)\n 'dist-newstyle', '.stack-work',\n // Infrastructure-as-code build/state\n '.terraform', '.serverless', 'cdk.out', '.aws-sam',\n]);\n\n// Lockfiles and generated dependency manifests — never hand-written source,\n// and single files can run to many MB (a pnpm-lock.yaml, a Yarn PnP .pnp.cjs).\n// Most carry extensions the graph doesn't parse anyway, but the ones that do\n// (`.pnp.cjs` is JavaScript) would otherwise be indexed as huge phantom\n// modules. Aligned with the scanner's SOURCE_EXCLUDE_FILES (core-open\n// `utils/fs.ts`), enforced by `test/discover-skips.test.ts`. Matched\n// case-insensitively against the basename; every entry must be lowercase.\nexport const SKIP_FILES = new Set<string>([\n // JavaScript / Node\n 'package-lock.json', 'npm-shrinkwrap.json', 'yarn.lock',\n 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock', 'deno.lock',\n '.pnp.cjs', '.pnp.data.json', '.pnp.loader.mjs',\n // Python\n 'poetry.lock', 'pipfile.lock', 'pdm.lock', 'uv.lock',\n 'pylock.toml', 'conda-lock.yml',\n // Ruby\n 'gemfile.lock',\n // PHP\n 'composer.lock',\n // Rust\n 'cargo.lock',\n // Go\n 'go.sum', 'go.work.sum', 'gopkg.lock', 'glide.lock',\n // .NET\n 'packages.lock.json',\n // Java / JVM (Gradle)\n 'gradle.lockfile',\n // Swift / Xcode\n 'package.resolved',\n // Dart / Flutter\n 'pubspec.lock',\n // Elixir\n 'mix.lock',\n // Haskell (Cabal / Stack)\n 'cabal.project.freeze', 'stack.yaml.lock',\n // Julia\n 'manifest.toml',\n // R\n 'renv.lock',\n // Perl (Carton)\n 'cpanfile.snapshot',\n // CocoaPods / Carthage\n 'podfile.lock', 'cartfile.resolved',\n // Terraform / IaC\n '.terraform.lock.hcl',\n // Helm\n 'chart.lock',\n // C / C++ (Conan)\n 'conan.lock',\n // Bazel\n 'module.bazel.lock',\n // Nix\n 'flake.lock',\n]);\n\nexport interface DiscoverOptions {\n /** Absolute root directory. */\n root: string;\n /** Restrict to these language ids (e.g. ['ts','py']). Empty = all. */\n only?: string[];\n /** Additional ignore globs (gitignore syntax), e.g. from config `exclude`. */\n exclude?: string[];\n /** Explicit sub-paths to scope to (relative or absolute). */\n paths?: string[];\n}\n\nexport interface DiscoveredFile {\n /** Relative POSIX path from root. */\n rel: string;\n /** Absolute path. */\n abs: string;\n lang: LanguageDef;\n}\n\nfunction toPosix(p: string): string {\n return p.split(path.sep).join('/');\n}\n\n/** Build the ignore matcher from the repo's .gitignore plus extra excludes. */\nfunction buildRootIgnore(root: string, exclude: string[]): Ignore {\n const ig = ignore();\n const gitignorePath = path.join(root, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n ig.add(fs.readFileSync(gitignorePath, 'utf8'));\n }\n if (exclude.length) ig.add(exclude);\n return ig;\n}\n\nexport function discover(options: DiscoverOptions): DiscoveredFile[] {\n const root = path.resolve(options.root);\n const onlyLangs = (options.only ?? []).filter(Boolean);\n const allowLang = (lang: LanguageDef): boolean =>\n onlyLangs.length === 0 || onlyLangs.includes(lang.id);\n\n // Validate `--only` ids early so a typo is a usage error, not silent emptiness.\n for (const id of onlyLangs) {\n if (!langById(id)) {\n throw new UsageError(`unknown language \"${id}\" for --only`);\n }\n }\n\n const rootIg = buildRootIgnore(root, options.exclude ?? []);\n\n // Scope roots: explicit paths, or the whole repo.\n const scopeAbs = (options.paths && options.paths.length\n ? options.paths.map((p) => path.resolve(root, p))\n : [root]\n ).filter((p) => fs.existsSync(p));\n\n const found = new Map<string, DiscoveredFile>();\n\n const considerFile = (abs: string): void => {\n const rel = toPosix(path.relative(root, abs));\n if (rel.startsWith('..')) return; // outside root\n if (rel === '' || rootIg.ignores(rel)) return;\n if (SKIP_FILES.has(path.basename(abs).toLowerCase())) return; // lockfiles etc.\n const lang = langForExtension(path.extname(abs));\n if (!lang || !allowLang(lang)) return;\n found.set(rel, { rel, abs, lang });\n };\n\n const walk = (dir: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return; // unreadable dir — skip rather than crash the build\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n const rel = toPosix(path.relative(root, abs));\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n if (rel && rootIg.ignores(`${rel}/`)) continue;\n walk(abs);\n } else if (entry.isFile()) {\n considerFile(abs);\n }\n }\n };\n\n for (const scope of scopeAbs) {\n const stat = fs.statSync(scope);\n if (stat.isDirectory()) walk(scope);\n else if (stat.isFile()) considerFile(scope);\n }\n\n return [...found.values()].sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));\n}\n\n/** A usage error that maps to exit code 5 at the CLI boundary. */\nexport class UsageError extends Error {\n readonly isUsageError = true;\n constructor(message: string) {\n super(message);\n this.name = 'UsageError';\n }\n}\n","import * as v8 from 'node:v8';\n\n/**\n * Resource safeguards for the graph build.\n *\n * Building the map holds every parse table, node, and edge in memory at once,\n * so a pathological corpus (a vendored 200 MB bundle, a million-file tree, a\n * giant TS program) can OOM-kill the process — an uncatchable crash that takes\n * the caller (e.g. a `scan --push`) down with it. These limits convert that\n * crash into either a deterministic skip (per-file size cap, tsc rung cap) or\n * a catchable, actionable error (corpus cap, heap budget).\n *\n * Every limit is overridable via environment variable, and `0` always means\n * \"disabled\". Skips are pure functions of the input (file size, file count) —\n * never of observed memory — so identical input still yields identical output.\n */\n\nexport interface ResourceLimits {\n /** Per-file source cap in bytes. Larger files stay stat-tracked for\n * freshness but are not parsed into the graph. 0 disables. */\n maxFileBytes: number;\n /** Ceiling on discovered corpus files; exceeding aborts with guidance\n * instead of grinding toward an OOM. 0 disables. */\n maxFiles: number;\n /** Ceiling on TS/JS files handed to the in-process TypeScript Compiler API\n * rung (a ts.Program over the whole corpus is the largest single memory\n * consumer). Above it the rung is skipped; the heuristic floor remains.\n * 0 disables. */\n tscMaxFiles: number;\n /** Heap budget in MiB checked at phase boundaries; exceeding aborts with a\n * clear error before V8 hard-crashes. 0 disables. */\n memoryBudgetMb: number;\n}\n\nconst MIB = 1024 * 1024;\n\nexport const DEFAULT_MAX_FILE_BYTES = 2 * MIB;\nexport const DEFAULT_MAX_FILES = 100_000;\nexport const DEFAULT_TSC_MAX_FILES = 10_000;\n\n/** Fraction of V8's heap ceiling we allow the build to consume before\n * aborting — past this an OOM crash is imminent anyway. */\nconst HEAP_GUARD_FRACTION = 0.9;\n\n/** A build stopped by a resource safeguard — catchable, unlike an OOM. The\n * message is user-facing and must carry its own remedy. */\nexport class ResourceLimitError extends Error {\n readonly isResourceLimitError = true;\n constructor(message: string) {\n super(message);\n this.name = 'ResourceLimitError';\n }\n}\n\n/** Non-negative integer from an env var; unset/invalid → fallback. */\nfunction envInt(name: string, fallback: number): number {\n const raw = process.env[name];\n if (raw === undefined || raw.trim() === '') return fallback;\n const n = Number(raw);\n return Number.isInteger(n) && n >= 0 ? n : fallback;\n}\n\n/** Like envInt but with no default — undefined when unset/invalid/0. */\nfunction envIntOptional(name: string): number | undefined {\n const n = envInt(name, 0);\n return n > 0 ? n : undefined;\n}\n\n/** Default heap budget: 90% of V8's configured heap ceiling (respects\n * NODE_OPTIONS=--max-old-space-size), in MiB. */\nexport function defaultMemoryBudgetMb(): number {\n return Math.floor((v8.getHeapStatistics().heap_size_limit / MIB) * HEAP_GUARD_FRACTION);\n}\n\n/**\n * Resolve effective limits: explicit overrides (tests, programmatic callers)\n * win over environment variables, which win over defaults.\n */\nexport function resolveLimits(overrides: Partial<ResourceLimits> = {}): ResourceLimits {\n return {\n maxFileBytes: overrides.maxFileBytes ?? envInt('VG_MAX_FILE_BYTES', DEFAULT_MAX_FILE_BYTES),\n maxFiles: overrides.maxFiles ?? envInt('VG_MAX_FILES', DEFAULT_MAX_FILES),\n tscMaxFiles: overrides.tscMaxFiles ?? envInt('VG_TSC_MAX_FILES', DEFAULT_TSC_MAX_FILES),\n memoryBudgetMb: overrides.memoryBudgetMb ?? envInt('VG_MEMORY_BUDGET_MB', defaultMemoryBudgetMb()),\n };\n}\n\n/** Default parse worker count override (`VG_JOBS`); undefined when unset. */\nexport function envJobs(): number | undefined {\n return envIntOptional('VG_JOBS');\n}\n\n/** Per-worker old-generation heap cap in MiB (`VG_WORKER_HEAP_MB`);\n * undefined when unset (workers inherit the platform default). */\nexport function envWorkerHeapMb(): number | undefined {\n return envIntOptional('VG_WORKER_HEAP_MB');\n}\n\n/**\n * Abort (catchably) when heap use crosses the budget. Called at phase\n * boundaries — cheap enough to call freely, and an abort here beats a V8\n * hard-crash a few allocations later. Only ever *throws*; it never alters\n * build output, so determinism is unaffected.\n */\nexport function checkMemoryBudget(phase: string, budgetMb: number): void {\n if (budgetMb <= 0) return;\n const usedMb = process.memoryUsage().heapUsed / MIB;\n if (usedMb <= budgetMb) return;\n throw new ResourceLimitError(\n `graph build stopped during ${phase}: heap use ${Math.round(usedMb)} MiB exceeds the ` +\n `${budgetMb} MiB budget. Narrow the build (scope to sub-paths, add --exclude globs, or ` +\n `--only <langs>), raise the Node heap (NODE_OPTIONS=--max-old-space-size=8192), or set ` +\n `VG_MEMORY_BUDGET_MB (0 disables this safeguard).`,\n );\n}\n\n/** Human-readable byte count for warnings (\"3.2 MiB\"). */\nexport function formatBytes(n: number): string {\n if (n >= MIB) return `${(n / MIB).toFixed(1)} MiB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KiB`;\n return `${n} B`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Module resolution for import edges. Resolves an import specifier (relative,\n * `tsconfig` path alias, or workspace-package name) to a repo-relative file —\n * the fix for alias-heavy TS monorepos (Nx/Turborepo) where every cross-package\n * import looked \"external\" and tanked call resolution.\n *\n * Deterministic: it reads the repo's tsconfig(s) and workspace manifests once at\n * construction, then `resolve()` is pure over those in-memory maps. Still the\n * heuristic rung — precise SCIP/stack-graphs slot above it later — but now\n * scope-aware of the project's own module map.\n */\n\nexport interface ModuleResolver {\n /** Resolve `source` imported from `fromRel`; returns a repo-rel path or null (external). */\n resolve(fromRel: string, source: string): string | null;\n}\n\n// Container SFC formats (.vue/.svelte/.astro) resolve as part of the JS/TS\n// group: their script region is JS/TS, they import ts/js modules, and ts/js\n// files import them back (`import Foo from './Foo.vue'`).\nconst JS_TS_EXT = ['.ts', '.tsx', '.mts', '.cts', '.js', '.jsx', '.mjs', '.cjs', '.vue', '.svelte', '.astro'];\nconst OTHER_EXT = [\n '.py', '.pyi', '.go', '.rs', '.rb', '.java', '.cs',\n '.php', '.kt', '.kts', '.swift', '.scala', '.sc', '.dart', '.lua',\n '.ex', '.exs', '.sh', '.bash', '.zig', '.c', '.cpp', '.cc', '.cxx', '.hpp', '.hh', '.hxx', '.h',\n '.m', '.mm', '.ml', '.mli', '.res', '.sol',\n];\n\n// Which target extensions a dotted import from a given file may resolve to.\n// Keeps Python imports matching Python files, Java matching Java, etc. — a\n// dotted module path must not cross languages.\nconst EXT_GROUPS: Record<string, string[]> = {\n '.py': ['.py', '.pyi'],\n '.pyi': ['.py', '.pyi'],\n '.java': ['.java'],\n '.cs': ['.cs'],\n '.go': ['.go'],\n '.rs': ['.rs'],\n '.rb': ['.rb'],\n};\nfor (const e of JS_TS_EXT) EXT_GROUPS[e] = JS_TS_EXT;\nconst CPP_EXT = ['.cpp', '.cc', '.cxx', '.hpp', '.hh', '.hxx', '.h'];\nObject.assign(EXT_GROUPS, {\n '.php': ['.php'],\n '.kt': ['.kt', '.kts'],\n '.kts': ['.kt', '.kts'],\n '.swift': ['.swift'],\n '.scala': ['.scala', '.sc'],\n '.sc': ['.scala', '.sc'],\n '.dart': ['.dart'],\n '.lua': ['.lua'],\n '.ex': ['.ex', '.exs'],\n '.exs': ['.ex', '.exs'],\n '.sh': ['.sh', '.bash'],\n '.bash': ['.sh', '.bash'],\n '.zig': ['.zig'],\n '.c': ['.c', '.h'],\n '.cpp': CPP_EXT,\n '.cc': CPP_EXT,\n '.cxx': CPP_EXT,\n '.hpp': CPP_EXT,\n '.hh': CPP_EXT,\n '.hxx': CPP_EXT,\n '.h': [...CPP_EXT, '.c'],\n // ObjC #imports headers; ObjC++ additionally reaches C++ headers.\n '.m': ['.h', '.m', '.mm'],\n '.mm': ['.h', '.m', '.mm', ...CPP_EXT],\n '.ml': ['.ml', '.mli'],\n '.mli': ['.ml', '.mli'],\n '.res': ['.res'],\n '.sol': ['.sol'],\n // Template containers: ERB fragments are Ruby; HTML/EJS script is JS.\n '.erb': ['.rb', '.erb'],\n '.html': JS_TS_EXT,\n '.htm': JS_TS_EXT,\n '.ejs': JS_TS_EXT,\n});\n\nexport function buildModuleResolver(root: string, relSet: Set<string>): ModuleResolver {\n const probe = makeProbe(relSet);\n const suffixIndex = buildSuffixIndex(relSet);\n const tsPaths = loadTsconfigPaths(root); // {baseUrlRel, paths}\n const workspaces = loadWorkspacePackages(root); // name -> dirRel\n\n function resolveAlias(source: string): string | null {\n if (!tsPaths) return null;\n for (const [pattern, targets] of tsPaths.paths) {\n const m = matchPattern(pattern, source);\n if (m === null) continue;\n for (const target of targets) {\n const sub = target.replace('*', m);\n const rel = posixJoin(tsPaths.baseUrlRel, sub);\n const hit = probe(rel);\n if (hit) return hit;\n }\n }\n return null;\n }\n\n function resolveWorkspace(source: string): string | null {\n if (!workspaces.size) return null;\n // longest package-name match (so @org/a/b prefers @org/a/b over @org/a)\n let best: { dirRel: string; rest: string } | null = null;\n for (const [name, dirRel] of workspaces) {\n if (source === name || source.startsWith(`${name}/`)) {\n const rest = source === name ? '' : source.slice(name.length + 1);\n if (!best || name.length > best.dirRel.length) best = { dirRel, rest };\n }\n }\n if (!best) return null;\n const base = best.rest ? posixJoin(best.dirRel, best.rest) : best.dirRel;\n return probe(base) ?? probe(posixJoin(base, 'src/index')) ?? probe(posixJoin(base, 'index'));\n }\n\n return {\n resolve(fromRel, source) {\n // PHP namespaces (`App\\\\Models\\\\User`) — treat as a dotted module path so\n // the PSR-4-style suffix machinery can match `src/Models/User.php`.\n if (source.includes('\\\\')) source = source.split('\\\\').join('.');\n // JS/TS relative (`./x`, `../x`) — join against the importer's directory.\n if (source.startsWith('./') || source.startsWith('../')) {\n return probe(posixJoin(path.posix.dirname(fromRel), source));\n }\n // Bare relative FILE references: `require 'helpers.php'` (PHP),\n // `import 'util.dart'`, `@import(\"util.zig\")`, `#include \"util.h\"` — an\n // extension-bearing name resolves against the importer's directory first.\n if (/\\.[A-Za-z0-9]+$/.test(source) && !source.startsWith('<')) {\n const hit = probe(posixJoin(path.posix.dirname(fromRel), source));\n if (hit) return hit;\n }\n // Python-style relative (`.models`, `..core.utils`, `.`) — leading dots are\n // package levels, not a filename. One dot = the file's package (its dir),\n // each extra dot goes up one package.\n if (source.startsWith('.')) {\n return resolvePyRelative(probe, fromRel, source);\n }\n return (\n resolveAlias(source) ??\n resolveWorkspace(source) ??\n resolveSuffix(suffixIndex, fromRel, source) ??\n resolveDotted(probe, source)\n );\n },\n };\n}\n\n// --- suffix-based module resolution (Python/Java packages, src-layout) ---\n\ninterface SuffixEntry {\n rel: string;\n key: string; // path without extension (or directory, for __init__/index)\n ext: string;\n}\n\n/**\n * Index every file by the LAST segment of its module key, so a dotted import can\n * be matched against the *tail* of a repo path. This is what makes real Python\n * and Java layouts resolve: `from src.feature_pipeline.services.x import Y` in a\n * monorepo where the file actually lives at\n * `feature-pipeline/src/feature_pipeline/services/x.py` (per-subproject `src/`\n * roots, PYTHONPATH-style), or `import com.example.Foo` →\n * `.../src/main/java/com/example/Foo.java`. A repo-root/`src/` prefix probe\n * (the old behaviour) resolved none of these, so cross-file edges were ~0.\n */\nfunction buildSuffixIndex(relSet: Set<string>): Map<string, SuffixEntry[]> {\n const byLast = new Map<string, SuffixEntry[]>();\n for (const rel of relSet) {\n const dot = rel.lastIndexOf('.');\n if (dot < 0) continue;\n const ext = rel.slice(dot);\n if (!EXT_GROUPS[ext]) continue;\n let key = rel.slice(0, dot);\n const base = key.slice(key.lastIndexOf('/') + 1);\n if (base === '__init__' || base === 'index') {\n key = key.slice(0, Math.max(0, key.length - base.length - 1)); // → directory key\n }\n if (!key) continue;\n const last = key.slice(key.lastIndexOf('/') + 1);\n const list = byLast.get(last);\n if (list) list.push({ rel, key, ext });\n else byLast.set(last, [{ rel, key, ext }]);\n }\n return byLast;\n}\n\n/**\n * Resolve a dotted module path (Python/Java) by matching it against the tail of\n * a repo file's path, restricted to the importer's language group. On multiple\n * matches, pick the file sharing the longest path prefix with the importer\n * (same subproject), then the shortest path, then lexicographically — fully\n * deterministic.\n */\nfunction resolveSuffix(\n index: Map<string, SuffixEntry[]>,\n fromRel: string,\n source: string,\n): string | null {\n if (!/^[A-Za-z_][\\w.]*$/.test(source) || !source.includes('.')) return null;\n const fromDot = fromRel.lastIndexOf('.');\n const fromExt = fromDot >= 0 ? fromRel.slice(fromDot) : '';\n const allowed = EXT_GROUPS[fromExt];\n if (!allowed) return null; // unknown importer language — don't risk a cross-language match\n const q = source.replace(/\\./g, '/');\n const last = q.slice(q.lastIndexOf('/') + 1);\n const cands = index.get(last);\n if (!cands) return null;\n const matches = cands.filter(\n (c) => allowed.includes(c.ext) && (c.key === q || c.key.endsWith('/' + q)),\n );\n if (matches.length === 0) return null;\n if (matches.length === 1) return matches[0].rel;\n return pickClosest(matches, fromRel).rel;\n}\n\nfunction pickClosest(matches: SuffixEntry[], fromRel: string): SuffixEntry {\n const fromSegs = fromRel.split('/');\n const score = (rel: string): number => {\n const segs = rel.split('/');\n let i = 0;\n while (i < segs.length && i < fromSegs.length && segs[i] === fromSegs[i]) i++;\n return i;\n };\n return [...matches].sort((a, b) => {\n const d = score(b.rel) - score(a.rel);\n if (d) return d;\n if (a.rel.length !== b.rel.length) return a.rel.length - b.rel.length;\n return a.rel < b.rel ? -1 : 1;\n })[0];\n}\n\n/**\n * Dotted-module resolution (Python/Java style): `app.core.security` →\n * `app/core/security(.py|/__init__.py)`. Tries a repo-root and `src/` layout.\n * Safe across languages — it only returns a hit when a real repo file matches,\n * so JS packages that contain a dot (e.g. `socket.io`) fall through to external.\n */\nfunction resolveDotted(probe: (base: string) => string | null, source: string): string | null {\n if (!/^[A-Za-z_][\\w.]*$/.test(source) || !source.includes('.')) return null;\n const slashed = source.replace(/\\./g, '/');\n return probe(slashed) ?? probe(posixJoin('src', slashed));\n}\n\n/**\n * Resolve a Python-style relative import. `source` is leading dots plus an\n * optional dotted module (`.models`, `..core.utils`, or just `.`). The number of\n * dots is the package level: one dot = the importer's own package (directory),\n * each additional dot ascends one package. A bare `from . import x` resolves to\n * the package itself (its `__init__.py`); the dotted-module form targets the\n * submodule file.\n */\nfunction resolvePyRelative(\n probe: (base: string) => string | null,\n fromRel: string,\n source: string,\n): string | null {\n let dots = 0;\n while (source[dots] === '.') dots++;\n const rest = source.slice(dots); // dotted submodule path, possibly empty\n let dir = path.posix.dirname(fromRel);\n for (let i = 1; i < dots; i++) dir = path.posix.dirname(dir);\n const sub = rest.replace(/\\./g, '/');\n return probe(sub ? posixJoin(dir, sub) : dir);\n}\n\n/** A resolver that only handles relative imports (no fs) — for tests/embedding. */\nexport function relativeResolver(relSet: Set<string>): ModuleResolver {\n const probe = makeProbe(relSet);\n return {\n resolve(fromRel, source) {\n if (source.startsWith('.')) return probe(posixJoin(path.posix.dirname(fromRel), source));\n return resolveDotted(probe, source);\n },\n };\n}\n\n// --- probing ---\n\nfunction makeProbe(relSet: Set<string>): (base: string) => string | null {\n return (base: string) => {\n const norm = normalizeRel(base);\n if (!norm) return null;\n if (relSet.has(norm)) return norm;\n for (const ext of JS_TS_EXT) if (relSet.has(norm + ext)) return norm + ext;\n for (const ext of JS_TS_EXT) if (relSet.has(`${norm}/index${ext}`)) return `${norm}/index${ext}`;\n for (const ext of OTHER_EXT) if (relSet.has(norm + ext)) return norm + ext;\n if (relSet.has(`${norm}/__init__.py`)) return `${norm}/__init__.py`;\n return null;\n };\n}\n\nfunction normalizeRel(p: string): string {\n const norm = path.posix.normalize(p);\n const stripped = norm.startsWith('./') ? norm.slice(2) : norm;\n return stripped.startsWith('..') ? '' : stripped;\n}\n\nfunction posixJoin(a: string, b: string): string {\n return path.posix.normalize(path.posix.join(a, b));\n}\n\n/** Match a tsconfig paths pattern (`@app/*`) against a specifier; returns the `*` capture or '' on exact, null on no match. */\nfunction matchPattern(pattern: string, source: string): string | null {\n const star = pattern.indexOf('*');\n if (star === -1) return source === pattern ? '' : null;\n const prefix = pattern.slice(0, star);\n const suffix = pattern.slice(star + 1);\n if (!source.startsWith(prefix) || !source.endsWith(suffix)) return null;\n if (source.length < prefix.length + suffix.length) return null;\n return source.slice(prefix.length, source.length - suffix.length);\n}\n\n// --- tsconfig ---\n\ninterface TsPaths {\n baseUrlRel: string; // relative to root\n paths: [string, string[]][];\n}\n\nfunction loadTsconfigPaths(root: string): TsPaths | null {\n // Prefer tsconfig.base.json (Nx) then tsconfig.json; follow `extends`.\n for (const name of ['tsconfig.base.json', 'tsconfig.json']) {\n const file = path.join(root, name);\n if (fs.existsSync(file)) {\n const merged = readTsconfigChain(root, file, new Set());\n if (merged && merged.paths.length) return merged;\n }\n }\n return null;\n}\n\nfunction readTsconfigChain(root: string, file: string, seen: Set<string>): TsPaths | null {\n if (seen.has(file) || seen.size > 6) return null;\n seen.add(file);\n let cfg: { extends?: string; compilerOptions?: { baseUrl?: string; paths?: Record<string, string[]> } };\n try {\n cfg = parseJsonc(fs.readFileSync(file, 'utf8'));\n } catch {\n return null;\n }\n const dir = path.dirname(file);\n let base: TsPaths = { baseUrlRel: '', paths: [] };\n if (cfg.extends && cfg.extends.startsWith('.')) {\n const extPath = path.resolve(dir, cfg.extends.endsWith('.json') ? cfg.extends : `${cfg.extends}.json`);\n if (fs.existsSync(extPath)) {\n const inherited = readTsconfigChain(root, extPath, seen);\n if (inherited) base = inherited;\n }\n }\n const co = cfg.compilerOptions ?? {};\n // baseUrl is relative to THIS config's dir; express it relative to the repo root.\n const baseUrlRel =\n co.baseUrl !== undefined\n ? path.relative(root, path.resolve(dir, co.baseUrl)).split(path.sep).join('/')\n : base.baseUrlRel;\n const paths: [string, string[]][] = [...base.paths];\n if (co.paths) for (const [k, v] of Object.entries(co.paths)) paths.push([k, v]);\n return { baseUrlRel, paths };\n}\n\n// --- workspaces ---\n\nfunction loadWorkspacePackages(root: string): Map<string, string> {\n const map = new Map<string, string>();\n const globs: string[] = [];\n\n const rootPkg = path.join(root, 'package.json');\n if (fs.existsSync(rootPkg)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(rootPkg, 'utf8')) as { workspaces?: string[] | { packages?: string[] } };\n const ws = Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces?.packages;\n if (ws) globs.push(...ws);\n } catch {\n /* ignore */\n }\n }\n const pnpmWs = path.join(root, 'pnpm-workspace.yaml');\n if (fs.existsSync(pnpmWs)) {\n for (const line of fs.readFileSync(pnpmWs, 'utf8').split('\\n')) {\n const m = /^\\s*-\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/.exec(line);\n if (m) globs.push(m[1].trim());\n }\n }\n\n for (const dir of expandWorkspaceGlobs(root, globs)) {\n const pj = path.join(dir, 'package.json');\n try {\n const name = (JSON.parse(fs.readFileSync(pj, 'utf8')) as { name?: string }).name;\n if (name) map.set(name, path.relative(root, dir).split(path.sep).join('/'));\n } catch {\n /* ignore */\n }\n }\n return map;\n}\n\n/** Resolve simple workspace globs (`packages/*`, `apps/*`, `libs/**`) to dirs containing package.json. */\nfunction expandWorkspaceGlobs(root: string, globs: string[]): string[] {\n const out = new Set<string>();\n for (const glob of globs) {\n const clean = glob.replace(/\\/\\*\\*$/, '').replace(/\\/\\*$/, '');\n const baseDir = path.join(root, clean);\n const recurse = glob.endsWith('**');\n if (glob === clean) {\n // No wildcard — a direct package dir.\n if (fs.existsSync(path.join(baseDir, 'package.json'))) out.add(baseDir);\n continue;\n }\n collectPackageDirs(baseDir, recurse ? 4 : 1, out);\n }\n return [...out];\n}\n\nfunction collectPackageDirs(dir: string, depth: number, out: Set<string>): void {\n if (depth < 0) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (!e.isDirectory() || e.name === 'node_modules' || e.name.startsWith('.')) continue;\n const child = path.join(dir, e.name);\n if (fs.existsSync(path.join(child, 'package.json'))) out.add(child);\n else collectPackageDirs(child, depth - 1, out);\n }\n}\n\n// --- tolerant JSONC ---\n\nexport function parseJsonc<T = unknown>(text: string): T {\n return JSON.parse(stripJsonc(text)) as T;\n}\n\nfunction stripJsonc(text: string): string {\n let out = '';\n let inStr = false;\n let strCh = '';\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n const next = text[i + 1];\n if (inStr) {\n out += ch;\n if (ch === '\\\\') {\n out += next ?? '';\n i++;\n } else if (ch === strCh) {\n inStr = false;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n inStr = true;\n strCh = ch;\n out += ch;\n continue;\n }\n if (ch === '/' && next === '/') {\n while (i < text.length && text[i] !== '\\n') i++;\n out += '\\n';\n continue;\n }\n if (ch === '/' && next === '*') {\n i += 2;\n while (i < text.length && !(text[i] === '*' && text[i + 1] === '/')) i++;\n i++;\n continue;\n }\n out += ch;\n }\n // drop trailing commas before } or ]\n return out.replace(/,(\\s*[}\\]])/g, '$1');\n}\n","import { canonicalize, shortId } from './hash.js';\nimport type { EdgeKind, NodeKind } from '../schema.js';\n\n/**\n * Content-addressed ids. The id of a node is a function only of its *identity*\n * (kind, qualified name, file, signature) — never its line span, which can move\n * without changing the node. So adding a blank line above a function leaves its\n * id (and every edge touching it) byte-identical.\n */\n\nexport interface NodeIdParts {\n kind: NodeKind;\n qualifiedName: string;\n file: string;\n signature?: string;\n}\n\nexport function nodeId(parts: NodeIdParts): string {\n return shortId(\n canonicalize({\n t: 'node',\n kind: parts.kind,\n qn: parts.qualifiedName,\n file: parts.file,\n sig: parts.signature ?? '',\n }),\n );\n}\n\nexport function edgeId(kind: EdgeKind, src: string, dst: string): string {\n return shortId(canonicalize({ t: 'edge', kind, src, dst }));\n}\n","import { edgeId } from './ids.js';\nimport type { GraphEdge, GraphNode } from '../schema.js';\n\n/**\n * Test-awareness (VG-ENGINE-TEARDOWN §3.6) — the wedge Graphify has no answer to.\n *\n * Deterministic, two signals:\n * 1. **Static linkage** — calls from a test file into product code become `test`\n * edges (test file → covered node), so we can answer \"which tests exercise\n * this\" from structure alone, no runner needed.\n * 2. **Coverage** (coverage.ts) — runtime-grounded line coverage applied as\n * `coverage` on nodes (stronger than static linkage when present).\n *\n * A node's `tested` flag is true when it has any incoming test/coverage signal;\n * false for analyzable code with none; null for non-analyzable kinds.\n */\n\nexport function isTestFile(rel: string): boolean {\n const lower = rel.toLowerCase();\n const base = rel.split('/').pop() ?? rel; // original case (for CamelCase rules)\n const lbase = base.toLowerCase();\n // Directory-based conventions (case-insensitive).\n if (/(^|\\/)(__tests__|__test__)\\//.test(lower)) return true;\n if (/(^|\\/)(tests?|spec|specs)\\//.test(lower)) return true;\n if (/(^|\\/)src\\/test\\//.test(lower)) return true;\n // Filename-based conventions across languages.\n if (/\\.(test|spec)\\.[cm]?[jt]sx?$/.test(lbase)) return true; // JS/TS\n if (/^test_.*\\.py$/.test(lbase) || /_test\\.py$/.test(lbase)) return true; // Python\n if (/_test\\.go$/.test(lbase)) return true; // Go\n if (/[A-Za-z0-9](Test|Tests|IT)\\.java$/.test(base)) return true; // *Test.java (CamelCase)\n if (/_spec\\.rb$/.test(lbase) || /_test\\.rb$/.test(lbase)) return true; // Ruby\n if (/[A-Za-z0-9](Test|Tests)\\.cs$/.test(base)) return true; // *Test.cs (CamelCase)\n if (/[A-Za-z0-9](Test|Tests)\\.swift$/.test(base)) return true; // XCTest *Tests.swift (CamelCase)\n return false;\n}\n\nexport interface TestAwarenessResult {\n nodes: GraphNode[];\n edges: GraphEdge[];\n testFiles: string[]; // rel paths\n testEdgeCount: number;\n}\n\n/**\n * Apply static test linkage. Adds `test` edges from each test file node to the\n * product-code nodes its functions call, and sets `tested` on analyzable nodes.\n */\nexport function applyStaticTestLinkage(nodes: GraphNode[], edges: GraphEdge[]): TestAwarenessResult {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const testFiles = new Set<string>();\n for (const n of nodes) if (n.kind === 'file' && isTestFile(n.file)) testFiles.add(n.file);\n\n // File node id per rel (to source test edges from the file).\n const fileNodeIdByRel = new Map<string, string>();\n for (const n of nodes) if (n.kind === 'file') fileNodeIdByRel.set(n.file, n.id);\n\n const covered = new Set<string>(); // node ids with a test signal\n const newEdges = new Map<string, GraphEdge>();\n\n for (const e of edges) {\n if (e.kind !== 'call') continue;\n const src = byId.get(e.src);\n const dst = byId.get(e.dst);\n if (!src || !dst) continue;\n // A call originating in a test file into non-test product code → test edge.\n if (testFiles.has(src.file) && !testFiles.has(dst.file) && dst.kind !== 'external') {\n const testFileId = fileNodeIdByRel.get(src.file);\n if (!testFileId) continue;\n const id = edgeId('test', testFileId, dst.id);\n if (!newEdges.has(id)) {\n newEdges.set(id, {\n id,\n kind: 'test',\n src: testFileId,\n dst: dst.id,\n resolution: e.resolution,\n confidence: e.confidence,\n });\n }\n covered.add(dst.id);\n }\n }\n\n const outNodes = nodes.map((n) => ({ ...n, tested: testedFlag(n, covered.has(n.id), testFiles) }));\n const outEdges = [...edges, ...newEdges.values()].sort(\n (a, b) => a.kind.localeCompare(b.kind) || a.src.localeCompare(b.src) || a.dst.localeCompare(b.dst),\n );\n\n return {\n nodes: outNodes,\n edges: outEdges,\n testFiles: [...testFiles].sort(),\n testEdgeCount: newEdges.size,\n };\n}\n\n/** Analyzable code units get true/false; everything else stays null. */\nfunction testedFlag(node: GraphNode, covered: boolean, testFiles: Set<string>): boolean | null {\n if (node.kind === 'external' || node.kind === 'file' || node.kind === 'package' || node.kind === 'module') {\n return null;\n }\n if (testFiles.has(node.file)) return null; // the test code itself isn't \"tested\"\n if (node.kind === 'function' || node.kind === 'method') return covered;\n // Classes/interfaces/etc.: covered if any signal, else leave null (not a unit).\n return covered ? true : node.tested ?? null;\n}\n","/**\n * SCIP ingestion — the precise resolution rung (VG-ENGINE-TEARDOWN §3.2).\n *\n * Reads a real SCIP index (`index.scip`) produced by a language indexer\n * (scip-typescript, scip-python, scip-java, rust-analyzer→SCIP, …) and turns its\n * precise occurrences into call/reference edges at `resolution: \"scip\"`,\n * confidence 1.0 — the genuine \"real SCIP vs Graphify's fake-SCIP\" win. vg does\n * NOT bundle indexers; it consumes an index the user/CI generates (deterministic,\n * offline). The heuristic resolver remains the floor for files SCIP didn't cover.\n *\n * A small, dependency-free protobuf reader decodes only the fields we need, so\n * the core stays lean.\n */\n\nimport type { EdgeKind, GraphEdge, GraphNode, ResolverKind } from '../schema.js';\nimport { edgeId } from './ids.js';\n\n// SCIP SymbolRole bitmask (scip.proto).\nconst ROLE_DEFINITION = 0x1;\n\nexport interface ScipOccurrence {\n /** [startLine, startChar, endLine, endChar] or [startLine, startChar, endChar], 0-based. */\n range: number[];\n symbol: string;\n roles: number;\n}\nexport interface ScipDocument {\n relativePath: string;\n occurrences: ScipOccurrence[];\n}\nexport interface ScipIndex {\n documents: ScipDocument[];\n toolName?: string;\n toolVersion?: string;\n}\n\n// --- minimal protobuf wire reader ---\n\nclass Reader {\n pos = 0;\n constructor(private buf: Uint8Array) {}\n get done(): boolean {\n return this.pos >= this.buf.length;\n }\n varint(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.buf[this.pos++];\n result += (b & 0x7f) * 2 ** shift; // avoid <<shift overflow past 31 bits\n if ((b & 0x80) === 0) break;\n shift += 7;\n }\n return result;\n }\n tag(): { field: number; wire: number } {\n const t = this.varint();\n return { field: t >>> 3, wire: t & 0x7 };\n }\n bytes(): Uint8Array {\n const len = this.varint();\n const out = this.buf.subarray(this.pos, this.pos + len);\n this.pos += len;\n return out;\n }\n skip(wire: number): void {\n if (wire === 0) this.varint();\n else if (wire === 2) this.bytes();\n else if (wire === 5) this.pos += 4;\n else if (wire === 1) this.pos += 8;\n }\n}\n\nconst td = new TextDecoder();\n\nexport function decodeScipIndex(buf: Uint8Array): ScipIndex {\n const index: ScipIndex = { documents: [] };\n const r = new Reader(buf);\n while (!r.done) {\n const { field, wire } = r.tag();\n if (field === 1 && wire === 2) decodeMetadata(r.bytes(), index); // Index.metadata\n else if (field === 2 && wire === 2) index.documents.push(decodeDocument(r.bytes()));\n else r.skip(wire);\n }\n return index;\n}\n\nfunction decodeMetadata(buf: Uint8Array, index: ScipIndex): void {\n const r = new Reader(buf);\n while (!r.done) {\n const { field, wire } = r.tag();\n if (field === 2 && wire === 2) decodeToolInfo(r.bytes(), index); // Metadata.tool_info\n else r.skip(wire);\n }\n}\n\nfunction decodeToolInfo(buf: Uint8Array, index: ScipIndex): void {\n const r = new Reader(buf);\n while (!r.done) {\n const { field, wire } = r.tag();\n if (field === 1 && wire === 2) index.toolName = td.decode(r.bytes());\n else if (field === 2 && wire === 2) index.toolVersion = td.decode(r.bytes());\n else r.skip(wire);\n }\n}\n\nfunction decodeDocument(buf: Uint8Array): ScipDocument {\n const doc: ScipDocument = { relativePath: '', occurrences: [] };\n const r = new Reader(buf);\n while (!r.done) {\n const { field, wire } = r.tag();\n if (field === 1 && wire === 2) doc.relativePath = td.decode(r.bytes()); // relative_path\n else if (field === 2 && wire === 2) doc.occurrences.push(decodeOccurrence(r.bytes()));\n else r.skip(wire);\n }\n return doc;\n}\n\nfunction decodeOccurrence(buf: Uint8Array): ScipOccurrence {\n const occ: ScipOccurrence = { range: [], symbol: '', roles: 0 };\n const r = new Reader(buf);\n while (!r.done) {\n const { field, wire } = r.tag();\n if (field === 1) {\n if (wire === 2) {\n // packed repeated int32\n const sub = new Reader(r.bytes());\n while (!sub.done) occ.range.push(sub.varint());\n } else if (wire === 0) {\n occ.range.push(r.varint());\n } else r.skip(wire);\n } else if (field === 2 && wire === 2) occ.symbol = td.decode(r.bytes());\n else if (field === 3 && wire === 0) occ.roles = r.varint();\n else r.skip(wire);\n }\n return occ;\n}\n\n// --- mapping occurrences → edges ---\n\nexport interface ScipResult {\n edges: GraphEdge[];\n /** Repo-relative files SCIP covered (it is authoritative for these). */\n coveredFiles: Set<string>;\n /** counts for status/provenance. */\n stats: { documents: number; references: number; resolved: number };\n}\n\n/**\n * Build precise edges from a SCIP index, mapped onto our nodes by (file, line).\n * A reference occurrence's enclosing node → the node where its symbol is defined.\n */\nexport function scipEdges(index: ScipIndex, nodes: GraphNode[], relForScip: (p: string) => string): ScipResult {\n // nodes per repo-relative file, with quick line lookup.\n const nodesByFile = new Map<string, GraphNode[]>();\n for (const n of nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const list = nodesByFile.get(n.file);\n if (list) list.push(n);\n else nodesByFile.set(n.file, [n]);\n }\n\n // First pass: symbol → defining node (from Definition occurrences).\n const symbolToNode = new Map<string, GraphNode>();\n const coveredFiles = new Set<string>();\n for (const doc of index.documents) {\n const file = relForScip(doc.relativePath);\n const fileNodes = nodesByFile.get(file);\n if (!fileNodes) continue;\n coveredFiles.add(file);\n for (const occ of doc.occurrences) {\n if ((occ.roles & ROLE_DEFINITION) === 0 || !occ.symbol || occ.symbol.startsWith('local ')) continue;\n const line = (occ.range[0] ?? 0) + 1; // SCIP is 0-based; our spans 1-based\n const node = nodeStartingAt(fileNodes, line) ?? enclosing(fileNodes, line);\n if (node) symbolToNode.set(occ.symbol, node);\n }\n }\n\n // Second pass: reference occurrences → edges.\n const edgeMap = new Map<string, GraphEdge>();\n let references = 0;\n let resolved = 0;\n for (const doc of index.documents) {\n const file = relForScip(doc.relativePath);\n const fileNodes = nodesByFile.get(file);\n if (!fileNodes) continue;\n for (const occ of doc.occurrences) {\n if ((occ.roles & ROLE_DEFINITION) !== 0 || !occ.symbol || occ.symbol.startsWith('local ')) continue;\n references++;\n const target = symbolToNode.get(occ.symbol);\n if (!target) continue; // symbol defined outside the repo (external) — skip\n const line = (occ.range[0] ?? 0) + 1;\n const src = enclosing(fileNodes, line);\n if (!src || src.id === target.id) continue;\n const kind: EdgeKind = target.kind === 'function' || target.kind === 'method' ? 'call' : 'references';\n add(edgeMap, kind, src.id, target.id);\n resolved++;\n }\n }\n\n return {\n edges: [...edgeMap.values()],\n coveredFiles,\n stats: { documents: index.documents.length, references, resolved },\n };\n}\n\nfunction add(map: Map<string, GraphEdge>, kind: EdgeKind, src: string, dst: string): void {\n const id = edgeId(kind, src, dst);\n const existing = map.get(id);\n if (existing) {\n existing.count = (existing.count ?? 1) + 1;\n return;\n }\n const resolution: ResolverKind = 'scip';\n map.set(id, { id, kind, src, dst, resolution, confidence: 1.0, count: 1 });\n}\n\n/** Smallest node whose span contains `line`. */\nfunction enclosing(nodes: GraphNode[], line: number): GraphNode | undefined {\n let best: GraphNode | undefined;\n for (const n of nodes) {\n if (n.span.start <= line && n.span.end >= line) {\n if (!best || n.span.end - n.span.start < best.span.end - best.span.start) best = n;\n }\n }\n return best;\n}\n\n/** A node whose span starts exactly at `line` (the defined symbol). */\nfunction nodeStartingAt(nodes: GraphNode[], line: number): GraphNode | undefined {\n let best: GraphNode | undefined;\n for (const n of nodes) {\n if (n.span.start === line) {\n if (!best || n.span.end - n.span.start < best.span.end - best.span.start) best = n;\n }\n }\n return best;\n}\n","/**\n * A tiny seeded PRNG (mulberry32). Used to make Louvain clustering deterministic\n * — same graph + same seed → same communities, every run, every machine. Never\n * use `Math.random()` anywhere in the engine; that would break the determinism\n * contract (VG-ENGINE-TEARDOWN §5).\n */\nexport function mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return function () {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** The fixed clustering seed (matches the documented determinism inputs). */\nexport const CLUSTER_SEED = 42;\n","import Graph from 'graphology';\nimport pagerank from 'graphology-metrics/centrality/pagerank.js';\nimport betweenness from 'graphology-metrics/centrality/betweenness.js';\nimport eigenvector from 'graphology-metrics/centrality/eigenvector.js';\nimport louvain from 'graphology-communities-louvain';\nimport { mulberry32, CLUSTER_SEED } from './rng.js';\nimport type { Area, EdgeKind, GraphEdge, GraphNode } from '../schema.js';\n\n/**\n * Analysis stage: importance, centrality, hubs, communities, and surprise.\n *\n * - **Centrality** blends PageRank + betweenness + eigenvector + degree over the\n * dependency graph (call/import/extends/implements/references), catching\n * high-fan-in critical nodes that degree-only ranking (Graphify) misses.\n * - **Communities** via Louvain (`graphology-communities-louvain`, MIT), seeded\n * and single-pass for determinism. Leiden (via a permissive WASM impl) is a\n * later enhancement; the cluster mode is reported honestly, never silent.\n * - **Hubs** are centrality outliers (importance ≥ mean + 2σ).\n * - **Surprise** flags improbable cross-area edges (architectural smells),\n * surfaced by `vg oddities`.\n *\n * Pure and deterministic: identical (nodes, edges) → identical result.\n */\n\nexport type ClusterMode = 'leiden' | 'louvain' | 'none';\n\nexport interface AnalyzeOptions {\n cluster?: ClusterMode; // default 'louvain'\n /** Skip betweenness above this node count (O(V·E) — too slow for huge graphs). */\n betweennessLimit?: number;\n}\n\nexport interface AnalyzeResult {\n nodes: GraphNode[];\n edges: GraphEdge[]; // surprise scores attached\n areas: Area[];\n cluster: ClusterMode;\n}\n\n// Edges that express dependency/importance (excludes contains/test/coverage).\nconst DEP_EDGES = new Set<EdgeKind>(['call', 'import', 'extends', 'implements', 'references']);\n// Edges that express cohesion for community detection (adds containment).\nconst CLUSTER_EDGE_KINDS = new Set<EdgeKind>([...DEP_EDGES, 'contains']);\n\nconst IMPORTANCE_WEIGHTS = { pagerank: 0.4, betweenness: 0.25, eigenvector: 0.2, degree: 0.15 };\nconst DEFAULT_BETWEENNESS_LIMIT = 5000;\n\nexport function analyze(\n nodes: GraphNode[],\n edges: GraphEdge[],\n options: AnalyzeOptions = {},\n): AnalyzeResult {\n const mode = options.cluster ?? 'louvain';\n // Sorted for deterministic graph construction (Louvain RNG consumption order).\n const ids = [...nodes.map((n) => n.id)].sort((a, b) => a.localeCompare(b));\n\n // --- centrality (directed dependency graph) ---\n const dg = simpleGraph(ids, edges, DEP_EDGES, 'directed');\n const pr = safeMetric(() => pagerank(dg), ids);\n const bw =\n dg.order <= (options.betweennessLimit ?? DEFAULT_BETWEENNESS_LIMIT)\n ? safeMetric(() => betweenness(dg), ids)\n : zeros(ids);\n const ev = safeMetric(() => eigenvector(dg), ids);\n const deg = degreeMap(dg, ids);\n\n const prN = normalize(pr);\n const bwN = normalize(bw);\n const evN = normalize(ev);\n const degN = normalize(deg);\n\n const importance = new Map<string, number>();\n for (const id of ids) {\n const score =\n IMPORTANCE_WEIGHTS.pagerank * (prN.get(id) ?? 0) +\n IMPORTANCE_WEIGHTS.betweenness * (bwN.get(id) ?? 0) +\n IMPORTANCE_WEIGHTS.eigenvector * (evN.get(id) ?? 0) +\n IMPORTANCE_WEIGHTS.degree * (degN.get(id) ?? 0);\n importance.set(id, score);\n }\n const importanceN = normalize(importance);\n\n // --- hubs (importance outliers) ---\n const vals = [...importanceN.values()];\n const mean = vals.reduce((a, b) => a + b, 0) / (vals.length || 1);\n const variance = vals.reduce((a, b) => a + (b - mean) ** 2, 0) / (vals.length || 1);\n const std = Math.sqrt(variance);\n const hubThreshold = mean + 2 * std;\n\n // --- communities (undirected cohesion graph) ---\n const { areaByNode, mode: actualMode } = cluster(ids, edges, mode);\n\n const outNodes: GraphNode[] = nodes\n .map((n) => ({\n ...n,\n centrality: {\n degree: round(degN.get(n.id) ?? 0),\n pagerank: round(prN.get(n.id) ?? 0),\n betweenness: round(bwN.get(n.id) ?? 0),\n eigenvector: round(evN.get(n.id) ?? 0),\n },\n importance: round(importanceN.get(n.id) ?? 0),\n area: areaByNode.get(n.id) ?? -1,\n isHub: (importanceN.get(n.id) ?? 0) >= hubThreshold && (importanceN.get(n.id) ?? 0) > 0,\n }))\n .sort((a, b) => a.id.localeCompare(b.id));\n\n // --- areas (with labels, cohesion, external-edge counts) ---\n const areas = buildAreas(outNodes, edges, areaByNode);\n\n // --- surprise on cross-area dependency edges ---\n const outEdges = scoreSurprise(edges, areaByNode);\n\n return { nodes: outNodes, edges: outEdges, areas, cluster: actualMode };\n}\n\n// --- graph construction ---\n\nfunction simpleGraph(\n ids: string[],\n edges: GraphEdge[],\n kinds: Set<EdgeKind>,\n type: 'directed' | 'undirected',\n): Graph {\n const g = new Graph({ type, multi: false, allowSelfLoops: false });\n for (const id of ids) g.addNode(id);\n for (const e of edges) {\n if (!kinds.has(e.kind)) continue;\n if (e.src === e.dst) continue;\n if (!g.hasNode(e.src) || !g.hasNode(e.dst)) continue;\n const w = (e.confidence || 0.5) * (e.count ?? 1);\n if (type === 'directed') {\n g.updateDirectedEdge(e.src, e.dst, (attr) => ({ weight: (attr?.weight ?? 0) + w }));\n } else {\n g.updateUndirectedEdge(e.src, e.dst, (attr) => ({ weight: (attr?.weight ?? 0) + w }));\n }\n }\n return g;\n}\n\nfunction cluster(\n ids: string[],\n edges: GraphEdge[],\n mode: ClusterMode,\n): { areaByNode: Map<string, number>; mode: ClusterMode } {\n if (mode === 'none' || ids.length === 0) {\n return { areaByNode: new Map(ids.map((id) => [id, -1])), mode: 'none' };\n }\n // Leiden is not yet bundled; fall back to Louvain and report it honestly.\n const used: ClusterMode = 'louvain';\n const ug = simpleGraph(ids, edges, CLUSTER_EDGE_KINDS, 'undirected');\n let communities: Record<string, number>;\n try {\n communities = louvain(ug, { rng: mulberry32(CLUSTER_SEED), resolution: 1 });\n } catch {\n return { areaByNode: new Map(ids.map((id) => [id, -1])), mode: 'none' };\n }\n\n // Remap arbitrary Louvain indices → stable area ids ordered by the lowest\n // member node id, so ids are deterministic and diff-stable across runs.\n const byCommunity = new Map<number, string[]>();\n for (const id of ids) {\n const ci = communities[id] ?? -1;\n const list = byCommunity.get(ci);\n if (list) list.push(id);\n else byCommunity.set(ci, [id]);\n }\n const ordered = [...byCommunity.entries()]\n .map(([, members]) => members.sort((a, b) => a.localeCompare(b)))\n .sort((a, b) => a[0].localeCompare(b[0]));\n\n const areaByNode = new Map<string, number>();\n ordered.forEach((members, areaId) => {\n for (const id of members) areaByNode.set(id, areaId);\n });\n return { areaByNode, mode: used };\n}\n\nfunction buildAreas(\n nodes: GraphNode[],\n edges: GraphEdge[],\n areaByNode: Map<string, number>,\n): Area[] {\n const byArea = new Map<number, GraphNode[]>();\n for (const n of nodes) {\n const a = areaByNode.get(n.id) ?? -1;\n if (a < 0) continue;\n const list = byArea.get(a);\n if (list) list.push(n);\n else byArea.set(a, [n]);\n }\n\n // External-edge counts per area (dependency edges crossing area boundaries).\n const externalByArea = new Map<number, number>();\n const internalByArea = new Map<number, number>();\n for (const e of edges) {\n if (!DEP_EDGES.has(e.kind)) continue;\n const sa = areaByNode.get(e.src);\n const da = areaByNode.get(e.dst);\n if (sa === undefined || da === undefined || sa < 0 || da < 0) continue;\n if (sa === da) internalByArea.set(sa, (internalByArea.get(sa) ?? 0) + 1);\n else {\n externalByArea.set(sa, (externalByArea.get(sa) ?? 0) + 1);\n externalByArea.set(da, (externalByArea.get(da) ?? 0) + 1);\n }\n }\n\n const areas: Area[] = [];\n for (const [id, members] of byArea) {\n const sorted = [...members].sort(\n (a, b) => b.importance - a.importance || a.id.localeCompare(b.id),\n );\n const label = sorted[0]?.qualifiedName ?? `area-${id}`;\n const internal = internalByArea.get(id) ?? 0;\n const external = externalByArea.get(id) ?? 0;\n const cohesion = internal + external > 0 ? internal / (internal + external) : 0;\n areas.push({\n id,\n label,\n size: members.length,\n members: members.map((m) => m.id).sort((a, b) => a.localeCompare(b)),\n cohesion: round(cohesion),\n externalEdges: external,\n });\n }\n return areas.sort((a, b) => a.id - b.id);\n}\n\nfunction scoreSurprise(edges: GraphEdge[], areaByNode: Map<string, number>): GraphEdge[] {\n // Count edges between each unordered pair of distinct areas. Rare connections\n // are more \"surprising\" (architectural shortcuts).\n const pairCount = new Map<string, number>();\n for (const e of edges) {\n if (!DEP_EDGES.has(e.kind)) continue;\n const sa = areaByNode.get(e.src);\n const da = areaByNode.get(e.dst);\n if (sa === undefined || da === undefined || sa < 0 || da < 0 || sa === da) continue;\n const key = pairKey(sa, da);\n pairCount.set(key, (pairCount.get(key) ?? 0) + 1);\n }\n\n return edges\n .map((e) => {\n if (!DEP_EDGES.has(e.kind)) return e;\n const sa = areaByNode.get(e.src);\n const da = areaByNode.get(e.dst);\n if (sa === undefined || da === undefined || sa < 0 || da < 0 || sa === da) return e;\n const count = pairCount.get(pairKey(sa, da)) ?? 1;\n // Fewer crossings between two areas → higher surprise.\n return { ...e, surprise: round(1 / count) };\n })\n .sort(\n (a, b) =>\n a.kind.localeCompare(b.kind) || a.src.localeCompare(b.src) || a.dst.localeCompare(b.dst),\n );\n}\n\n// --- numeric helpers ---\n\nfunction safeMetric(fn: () => Record<string, number>, ids: string[]): Map<string, number> {\n try {\n const res = fn();\n return new Map(ids.map((id) => [id, res[id] ?? 0]));\n } catch {\n return zeros(ids);\n }\n}\n\nfunction degreeMap(g: Graph, ids: string[]): Map<string, number> {\n return new Map(ids.map((id) => [id, g.hasNode(id) ? g.degree(id) : 0]));\n}\n\nfunction zeros(ids: string[]): Map<string, number> {\n return new Map(ids.map((id) => [id, 0]));\n}\n\nfunction normalize(m: Map<string, number>): Map<string, number> {\n let max = 0;\n for (const v of m.values()) if (v > max) max = v;\n if (max <= 0) return new Map(m);\n return new Map([...m].map(([k, v]) => [k, v / max]));\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n\nfunction pairKey(a: number, b: number): string {\n return a < b ? `${a}|${b}` : `${b}|${a}`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { GraphNode } from '../schema.js';\n\n/**\n * Coverage ingestion (VG-ENGINE-TEARDOWN §3.6) — runtime-grounded test linkage.\n * Parses LCOV (`coverage/lcov.info`) and Istanbul (`coverage-final.json`) into a\n * per-file line→hits map, then sets each node's `coverage` (fraction of its span\n * that ran) and `tested` flag. Stronger than static linkage where present.\n */\n\nexport type LineHits = Map<number, number>; // line → hit count\nexport type CoverageMap = Map<string, LineHits>; // repo-relative posix path → lines\n\nconst DEFAULT_PATHS = [\n 'coverage/lcov.info',\n 'lcov.info',\n 'coverage/coverage-final.json',\n 'coverage-final.json',\n];\n\n/** Find and parse coverage reports under root. Returns null if none found. */\nexport function loadCoverage(root: string, explicit?: string[]): CoverageMap | null {\n const candidates = (explicit && explicit.length ? explicit : DEFAULT_PATHS).map((p) =>\n path.resolve(root, p),\n );\n const found = candidates.filter((p) => fs.existsSync(p));\n if (found.length === 0) return null;\n\n const map: CoverageMap = new Map();\n for (const file of found) {\n try {\n const text = fs.readFileSync(file, 'utf8');\n if (file.endsWith('.json')) mergeIstanbul(map, text, root);\n else mergeLcov(map, text, root);\n } catch {\n /* skip unreadable/garbled report */\n }\n }\n return map.size ? map : null;\n}\n\nfunction rel(root: string, p: string): string {\n const abs = path.isAbsolute(p) ? p : path.resolve(root, p);\n return path.relative(root, abs).split(path.sep).join('/');\n}\n\nfunction bump(map: CoverageMap, file: string, line: number, hits: number): void {\n let lh = map.get(file);\n if (!lh) {\n lh = new Map();\n map.set(file, lh);\n }\n lh.set(line, Math.max(lh.get(line) ?? 0, hits));\n}\n\nfunction mergeLcov(map: CoverageMap, text: string, root: string): void {\n let current: string | null = null;\n for (const raw of text.split('\\n')) {\n const line = raw.trim();\n if (line.startsWith('SF:')) current = rel(root, line.slice(3));\n else if (line.startsWith('DA:') && current) {\n const [ln, hits] = line.slice(3).split(',');\n const n = Number(ln);\n const h = Number(hits);\n if (Number.isFinite(n)) bump(map, current, n, Number.isFinite(h) ? h : 0);\n } else if (line === 'end_of_record') current = null;\n }\n}\n\ninterface IstanbulEntry {\n path?: string;\n statementMap?: Record<string, { start: { line: number }; end: { line: number } }>;\n s?: Record<string, number>;\n}\n\nfunction mergeIstanbul(map: CoverageMap, text: string, root: string): void {\n const data = JSON.parse(text) as Record<string, IstanbulEntry>;\n for (const [key, entry] of Object.entries(data)) {\n const file = rel(root, entry.path ?? key);\n const stmts = entry.statementMap ?? {};\n const counts = entry.s ?? {};\n for (const [id, loc] of Object.entries(stmts)) {\n const hits = counts[id] ?? 0;\n const start = loc.start?.line;\n const end = loc.end?.line ?? start;\n if (!Number.isFinite(start)) continue;\n for (let ln = start; ln <= end; ln++) bump(map, file, ln, hits);\n }\n }\n}\n\n/** Apply coverage to nodes: set `coverage` fraction over the node's span + `tested`. */\nexport function applyCoverage(nodes: GraphNode[], coverage: CoverageMap): GraphNode[] {\n return nodes.map((n) => {\n if (n.kind === 'file' || n.kind === 'external') return n;\n const lh = coverage.get(n.file);\n if (!lh) return n;\n let instrumented = 0;\n let covered = 0;\n for (let ln = n.span.start; ln <= n.span.end; ln++) {\n const hits = lh.get(ln);\n if (hits === undefined) continue;\n instrumented++;\n if (hits > 0) covered++;\n }\n if (instrumented === 0) return n;\n const fraction = Math.round((covered / instrumented) * 1e6) / 1e6;\n const tested = covered > 0 ? true : n.kind === 'function' || n.kind === 'method' ? false : n.tested;\n return { ...n, coverage: fraction, tested };\n });\n}\n","import { canonicalize, shortId } from './hash.js';\nimport type { Fact, GraphEdge, GraphNode } from '../schema.js';\nimport type { FileParse } from './types.js';\n\n/**\n * The open facts subset (VG-PACKAGE-AND-SCHEMA §5) — reimplemented fresh in the\n * open engine: deterministic, no runtime, no corpus, no LLM, no hidden pipeline.\n * Three commodity fact kinds, each epistemic-typed so it never claims more than\n * the open layer can prove:\n *\n * - **contract** — from a public signature/type (declared → Observed)\n * - **invariant** — from a static assert/guard (static → Derived)\n * - **characterization** — from existing test linkage (static → Observed)\n *\n * Emitted with `--deep`.\n */\nexport function buildFacts(parses: FileParse[], nodes: GraphNode[], edges: GraphEdge[]): Fact[] {\n const facts: Fact[] = [];\n const byId = new Map(nodes.map((n) => [n.id, n]));\n\n // Index code defs per file for line→enclosing-def lookup (invariants).\n const defsByFile = new Map<string, GraphNode[]>();\n for (const n of nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const list = defsByFile.get(n.file);\n if (list) list.push(n);\n else defsByFile.set(n.file, [n]);\n }\n\n // --- contracts (from signatures) ---\n for (const n of nodes) {\n if ((n.kind === 'function' || n.kind === 'method') && n.signature) {\n facts.push(makeFact('contract', [n.id], { signature: n.signature }, 'declared', 'Observed', [\n { file: n.file, span: n.span },\n ]));\n }\n }\n\n // --- invariants (from static guards) ---\n for (const p of parses) {\n const defs = defsByFile.get(p.rel);\n if (!defs) continue;\n for (const g of p.guards) {\n const owner = enclosing(defs, g.line);\n if (!owner) continue;\n facts.push(\n makeFact('invariant', [owner.id], { guard: g.expr }, 'static', 'Derived', [\n { file: p.rel, span: { start: g.line, end: g.line } },\n ]),\n );\n }\n }\n\n // --- characterization (from test linkage) ---\n const testsByNode = new Map<string, string[]>();\n for (const e of edges) {\n if (e.kind !== 'test') continue;\n const testFile = byId.get(e.src)?.file;\n if (!testFile) continue;\n const list = testsByNode.get(e.dst);\n if (list) list.push(testFile);\n else testsByNode.set(e.dst, [testFile]);\n }\n for (const [nodeId, testFiles] of testsByNode) {\n const n = byId.get(nodeId);\n if (!n) continue;\n facts.push(\n makeFact(\n 'characterization',\n [nodeId],\n { pinnedBy: [...new Set(testFiles)].sort() },\n 'static',\n 'Observed',\n [{ file: n.file, span: n.span }],\n ),\n );\n }\n\n return facts.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction makeFact(\n kind: Fact['kind'],\n subjectIds: string[],\n predicate: unknown,\n derivedBy: Fact['derivedBy'],\n confidence: Fact['confidence'],\n evidence: Fact['evidence'],\n): Fact {\n const id = shortId(canonicalize({ t: 'fact', kind, subjectIds, predicate }));\n return { id, kind, subjectIds, predicate, derivedBy, confidence, evidence };\n}\n\n/** Smallest def whose line span contains `line`. */\nfunction enclosing(defs: GraphNode[], line: number): GraphNode | undefined {\n let best: GraphNode | undefined;\n for (const d of defs) {\n if (d.span.start <= line && d.span.end >= line) {\n if (!best || d.span.end - d.span.start < best.span.end - best.span.start) best = d;\n }\n }\n return best;\n}\n","import type { GroundingKind } from '../schema.js';\n\n/**\n * The free knowledge pack shipped in the open CLI (VG-PACKAGE-AND-SCHEMA §6):\n * our own paraphrased guidance + openly-licensed standards (OWASP Top 10 2021,\n * CWE). Never verbatim proprietary text; every entry cites a public source.\n * Matching is deterministic (imports / called APIs / identifier keywords).\n */\n\nexport interface MatchRule {\n imports?: string[]; // module/package signals (substring match on import source)\n calls?: string[]; // called-API signals (callee short name)\n keywords?: string[]; // identifier/name signals (word part of the node name)\n}\n\nexport interface PackEntry {\n id: string;\n topic: string;\n summary: string;\n citation: { title: string; url: string };\n kind: GroundingKind;\n rationale: 'recommended' | 'conjectured';\n match: MatchRule;\n}\n\nexport interface KnowledgePack {\n id: string;\n version: string;\n license: string;\n entries: PackEntry[];\n}\n\nexport const FREE_PACK: KnowledgePack = {\n id: 'vibgrate-free',\n version: '2026.06',\n license: 'CC-BY (standards summaries) + Apache-2.0 (own content)',\n entries: [\n {\n id: 'owasp-a01-access-control',\n topic: 'access-control',\n summary:\n 'Enforce authorization on every request server-side; deny by default and check the user’s role and ownership, not just authentication.',\n citation: { title: 'OWASP Top 10 2021 A01: Broken Access Control', url: 'https://owasp.org/Top10/A01_2021-Broken_Access_Control/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: {\n keywords: ['auth', 'authorize', 'authorization', 'permission', 'role', 'access', 'acl', 'rbac', 'tenant'],\n imports: ['casl', 'accesscontrol', 'next-auth'],\n },\n },\n {\n id: 'owasp-a07-auth-failures',\n topic: 'authentication',\n summary:\n 'Use vetted auth libraries, hash passwords with a strong adaptive function, rate-limit logins, and keep sessions short and rotated.',\n citation: { title: 'OWASP Top 10 2021 A07: Identification & Authentication Failures', url: 'https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: {\n keywords: ['login', 'authenticate', 'signin', 'session', 'jwt', 'password', 'credential'],\n imports: ['passport', 'jsonwebtoken', 'bcrypt', 'argon2', 'next-auth', 'lucia'],\n },\n },\n {\n id: 'owasp-a02-crypto-failures',\n topic: 'cryptography',\n summary:\n 'Prefer well-reviewed primitives; never roll your own crypto; use authenticated encryption and a strong KDF; never hardcode keys.',\n citation: { title: 'OWASP Top 10 2021 A02: Cryptographic Failures', url: 'https://owasp.org/Top10/A02_2021-Cryptographic_Failures/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: { keywords: ['encrypt', 'decrypt', 'cipher', 'hash', 'hmac', 'crypto', 'sign', 'verify'], imports: ['crypto', 'bcrypt', 'argon2', 'node:crypto', 'tweetnacl'], calls: ['createCipheriv', 'createHash', 'randomBytes'] },\n },\n {\n id: 'owasp-a03-injection',\n topic: 'input-validation',\n summary:\n 'Validate and parameterize all untrusted input; use parameterized queries and schema validation rather than string concatenation.',\n citation: { title: 'OWASP Top 10 2021 A03: Injection', url: 'https://owasp.org/Top10/A03_2021-Injection/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: { keywords: ['validate', 'sanitize', 'escape', 'schema', 'parse'], imports: ['zod', 'joi', 'yup', 'ajv', 'validator', 'class-validator'] },\n },\n {\n id: 'cwe-89-sql-injection',\n topic: 'sql-injection',\n summary:\n 'Use parameterized queries / prepared statements or a query builder; never build SQL by concatenating user input.',\n citation: { title: 'CWE-89: SQL Injection', url: 'https://cwe.mitre.org/data/definitions/89.html' },\n kind: 'relevant_to',\n rationale: 'recommended',\n match: { keywords: ['sql', 'query', 'where', 'select'], imports: ['pg', 'mysql', 'mysql2', 'sqlite3', 'better-sqlite3', 'knex', 'sequelize', 'typeorm', 'prisma', 'drizzle'], calls: ['query', 'execute', 'raw'] },\n },\n {\n id: 'cwe-798-hardcoded-credentials',\n topic: 'secrets',\n summary:\n 'Do not embed secrets/API keys/passwords in source; load them from a secrets manager or environment and keep them out of version control.',\n citation: { title: 'CWE-798: Use of Hard-coded Credentials', url: 'https://cwe.mitre.org/data/definitions/798.html' },\n kind: 'smells_like',\n rationale: 'conjectured',\n match: { keywords: ['secret', 'apikey', 'apikeys', 'token', 'credential', 'password', 'privatekey'] },\n },\n {\n id: 'cwe-502-deserialization',\n topic: 'deserialization',\n summary:\n 'Avoid deserializing untrusted data and never eval it; prefer safe parsers and explicit schemas.',\n citation: { title: 'CWE-502: Deserialization of Untrusted Data', url: 'https://cwe.mitre.org/data/definitions/502.html' },\n kind: 'smells_like',\n rationale: 'conjectured',\n match: { keywords: ['deserialize', 'unserialize', 'eval'], calls: ['eval', 'Function', 'deserialize'] },\n },\n {\n id: 'owasp-a10-ssrf',\n topic: 'ssrf',\n summary:\n 'Validate and allowlist outbound URLs built from user input to prevent server-side request forgery.',\n citation: { title: 'OWASP Top 10 2021 A10: Server-Side Request Forgery', url: 'https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/' },\n kind: 'relevant_to',\n rationale: 'recommended',\n match: { keywords: ['fetch', 'request', 'webhook', 'proxy'], imports: ['axios', 'node-fetch', 'got', 'undici', 'superagent'], calls: ['fetch', 'request', 'get', 'post'] },\n },\n {\n id: 'owasp-a09-logging',\n topic: 'logging',\n summary:\n 'Log security-relevant events with enough context to detect and investigate, but never log secrets or PII.',\n citation: { title: 'OWASP Top 10 2021 A09: Security Logging & Monitoring Failures', url: 'https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/' },\n kind: 'relevant_to',\n rationale: 'recommended',\n match: { keywords: ['log', 'logger', 'audit', 'trace'], imports: ['winston', 'pino', 'bunyan', 'log4js'] },\n },\n ],\n};\n","import { FREE_PACK, type KnowledgePack, type PackEntry } from '../grounding/pack.js';\nimport type { GraphEdge, GraphNode, GroundingEdge } from '../schema.js';\nimport type { FileParse } from './types.js';\n\n/**\n * Grounding (VG-PACKAGE-AND-SCHEMA §6) — match nodes to knowledge-pack entries by\n * deterministic signals (file imports, called APIs, identifier keywords) and\n * attach cited framing edges. Closed-world tools can't follow without building a\n * corpus. Deterministic-first; the free pack ships in the open CLI.\n */\nexport function groundGraph(\n nodes: GraphNode[],\n edges: GraphEdge[],\n parses: FileParse[],\n packs: KnowledgePack[] = [FREE_PACK],\n): GroundingEdge[] {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const importsByFile = new Map<string, string[]>();\n for (const p of parses) importsByFile.set(p.rel, p.imports.map((i) => i.source.toLowerCase()));\n\n // callee names per node (from call edges).\n const calleesByNode = new Map<string, string[]>();\n for (const e of edges) {\n if (e.kind !== 'call') continue;\n const callee = byId.get(e.dst)?.name;\n if (!callee) continue;\n const list = calleesByNode.get(e.src);\n if (list) list.push(callee.toLowerCase());\n else calleesByNode.set(e.src, [callee.toLowerCase()]);\n }\n\n const out: GroundingEdge[] = [];\n for (const n of nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const nameParts = new Set(\n n.name\n .split(/[^a-zA-Z0-9]+|(?<=[a-z])(?=[A-Z])/)\n .filter(Boolean)\n .map((s) => s.toLowerCase()),\n );\n const imports = importsByFile.get(n.file) ?? [];\n const callees = calleesByNode.get(n.id) ?? [];\n\n for (const pack of packs) {\n for (const entry of pack.entries) {\n const conf = matchConfidence(entry, nameParts, imports, callees);\n if (conf > 0) {\n out.push({\n src: n.id,\n packEntryId: entry.id,\n kind: entry.kind,\n confidence: conf,\n rationale: entry.rationale,\n citation: entry.citation,\n });\n }\n }\n }\n }\n\n return out.sort(\n (a, b) =>\n a.src.localeCompare(b.src) || a.packEntryId.localeCompare(b.packEntryId),\n );\n}\n\nfunction matchConfidence(\n entry: PackEntry,\n nameParts: Set<string>,\n imports: string[],\n callees: string[],\n): number {\n let conf = 0;\n if (entry.match.imports) {\n for (const sig of entry.match.imports) {\n if (imports.some((imp) => imp.includes(sig.toLowerCase()))) {\n conf = Math.max(conf, 0.8);\n break;\n }\n }\n }\n if (entry.match.calls) {\n const want = new Set(entry.match.calls.map((s) => s.toLowerCase()));\n if (callees.some((c) => want.has(c))) conf = Math.max(conf, 0.7);\n }\n if (entry.match.keywords) {\n if (entry.match.keywords.some((k) => nameParts.has(k.toLowerCase()))) {\n conf = Math.max(conf, 0.5);\n }\n }\n return conf;\n}\n","/**\n * The `vg-graph/1.0` on-disk schema.\n *\n * This is vg's own open schema (VG-PACKAGE-AND-SCHEMA.md §4) — informed by good\n * ideas (content-hashed ids, epistemic typing of facts) but standalone and\n * self-contained. Every collection is deterministically serialized\n * (sorted keys, stable element order). These TypeScript shapes are normative.\n */\n\nexport const SCHEMA_VERSION = 'vg-graph/1.0' as const;\n\nexport type ResolverKind = 'scip' | 'stackgraph' | 'tsc' | 'heuristic';\n\n/** Coarse, honest resolution tier for an edge (see engine/epistemic.ts). */\nexport type EpistemicTier = 'observed' | 'name-matched' | 'declared';\n\n/**\n * The toolchain that produced this graph — the reproducibility fingerprint.\n * Everything here deterministically affects graph *content* (parse trees change\n * between grammar releases; resolvers change which edges resolve), so a CI run\n * and a laptop run that disagree can be caught by comparing `fingerprint`.\n * Deliberately excludes the Node/OS version so the graph stays byte-stable\n * across host runtimes; `fingerprint` pins the parse/resolve toolchain only.\n */\nexport interface Toolchain {\n schema: string; // SCHEMA_VERSION\n tool: string; // vg calendar version\n grammars: string; // tree-sitter grammar set version string\n resolvers: ResolverKind[]; // resolver kinds available, sorted\n fingerprint: string; // shortId over the fields above — the value `vg attest` signs\n}\n\nexport interface Provenance {\n tool: 'vg';\n version: string; // calendar version\n grammars: Record<string, string>; // lang → grammar version (determinism input)\n resolver: ResolverKind[];\n deep: boolean; // did the heavier open passes run\n semanticModel?: string; // embedding model id+version if --deep semantic links\n corpusHash: string; // blake3 over the included file set + hashes\n toolchain?: Toolchain; // reproducibility fingerprint (checked by `vg verify`)\n}\n\nexport interface GraphMeta {\n root: string; // relative; portable across machines\n languages: string[];\n counts: {\n nodes: number;\n edges: number;\n areas: number;\n tests: number;\n untested: number;\n };\n cluster: 'leiden' | 'louvain' | 'none';\n edgeKinds: EdgeKind[];\n}\n\nexport type NodeKind =\n | 'file'\n | 'module'\n | 'package'\n | 'class'\n | 'interface'\n | 'function'\n | 'method'\n | 'property'\n | 'test'\n | 'route'\n | 'component'\n | 'external';\n\nexport interface Span {\n start: number; // 1-based start line\n end: number; // 1-based end line\n}\n\nexport interface Centrality {\n degree: number;\n pagerank: number;\n betweenness: number;\n eigenvector: number;\n}\n\nexport interface GraphNode {\n id: string; // blake3(canonical(kind, qualifiedName, file, signature))\n kind: NodeKind;\n name: string; // short name\n qualifiedName: string;\n file: string; // relative path\n span: Span; // line range (excluded from id hash)\n lang: string;\n visibility?: 'public' | 'private' | 'protected' | 'internal';\n signature?: string;\n doc?: string; // short leading doc-comment / docstring summary (deterministic; not a full body)\n importance: number; // 0..1 blended centrality\n centrality: Centrality;\n area: number; // area id (the node's community); -1 = unassigned (cluster \"none\")\n isHub: boolean; // centrality outlier — surfaced by `vg hubs`\n tested: boolean | null; // null = not analyzable (e.g. external)\n coverage?: number; // 0..1 line coverage if a coverage report was ingested\n changeCoupling?: string[]; // node ids that historically change together\n}\n\nexport type EdgeKind =\n | 'call'\n | 'import'\n | 'contains'\n | 'extends'\n | 'implements'\n | 'references'\n | 'test'\n | 'coverage';\n\nexport interface GraphEdge {\n id: string; // blake3(canonical(kind, src, dst))\n kind: EdgeKind;\n src: string; // node id\n dst: string; // node id\n resolution: ResolverKind; // how the edge was resolved\n confidence: number; // 0..1 (1.0 for scip/declared; lower for heuristic/dynamic)\n epistemic?: EpistemicTier; // coarse honesty tier derived from resolution+kind\n surprise?: number; // 0..1 improbability under the area model (`vg oddities`)\n count?: number; // call-site multiplicity\n}\n\nexport interface Area {\n id: number; // stable across runs (remapped to previous committed map)\n label: string; // most-central member's name (editable via `vg label`)\n size: number;\n members: string[]; // node ids, sorted\n cohesion: number; // 0..1\n externalEdges: number; // cross-area edge count\n}\n\nexport type FactKind = 'contract' | 'invariant' | 'characterization';\nexport type DerivedBy = 'declared' | 'static';\nexport type FactConfidence = 'Observed' | 'Derived';\n\nexport interface Fact {\n id: string; // blake3(canonical(kind, subjectIds, predicate))\n kind: FactKind;\n subjectIds: string[]; // node ids this fact constrains\n predicate: unknown; // the constraint\n derivedBy: DerivedBy;\n confidence: FactConfidence;\n evidence: { file: string; span: Span }[];\n}\n\n/**\n * A reference the graph could not resolve — surfaced by `vg unknowns`. Reporting\n * what it *cannot* connect (ranked by blast radius) is the honest inverse of a\n * scanner that hides its unknowns. Only unknowns the precise rungs (tsc/scip)\n * did not supersede are recorded, so a compiler-resolved file never shows here.\n */\nexport interface Unknown {\n from: string; // node id where the unresolved reference occurs\n name: string; // the callee/type name that could not be resolved\n kind: 'call' | 'extends' | 'implements';\n count: number; // occurrences at this site\n}\n\nexport type GroundingKind = 'should_follow' | 'smells_like' | 'relevant_to';\n\nexport interface GroundingEdge {\n src: string; // node id\n packEntryId: string;\n kind: GroundingKind;\n confidence: number; // 0..1\n rationale: 'recommended' | 'conjectured';\n citation: { title: string; url: string };\n}\n\nexport interface VgGraph {\n schemaVersion: typeof SCHEMA_VERSION;\n generatedAt: string; // ISO; the ONLY nondeterministic field (pinned by --generated-at)\n provenance: Provenance;\n meta: GraphMeta;\n nodes: GraphNode[]; // sorted by id\n edges: GraphEdge[]; // sorted by (kind, src, dst)\n areas: Area[]; // sorted by id\n facts?: Fact[]; // present with --deep; sorted by id\n grounding?: GroundingEdge[]; // free-pack grounding (default on; omit with --no-ground)\n unknowns?: Unknown[]; // heuristic references left unresolved; sorted by (from, kind, name)\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parseSource } from './parse.js';\nimport { setGrammarsOverride } from './grammars.js';\nimport { checkMemoryBudget, envJobs, envWorkerHeapMb, ResourceLimitError } from './limits.js';\nimport type { DiscoveredFile } from './discover.js';\nimport type { FileParse } from './types.js';\nimport type { ParseTask } from './parse-worker.js';\n\n/**\n * Parse a set of discovered files into FileParse tables.\n *\n * Parsing is CPU-bound and per-file independent, so it parallelises across a\n * worker_threads pool (tinypool) and scales near-linearly with cores — the\n * direct mechanism behind the \"≥5× build\" mandate (VG-ENGINE-TEARDOWN §3.10).\n *\n * The result is identical regardless of how work was sharded: every output is\n * sorted by relative path, so the build never depends on scheduling order. A\n * single-threaded inline path is always available (and used for small repos or\n * when the worker module isn't resolvable, e.g. under ts-only test runners),\n * producing byte-identical output to the pooled path.\n */\n\nexport interface ParseOptions {\n /** Worker count. Default: min(cores - 1, file count). 1 forces inline. */\n jobs?: number;\n /** Force the single-threaded path (tests, debugging). */\n inline?: boolean;\n /** Below this many files, run inline (worker spin-up isn't worth it). */\n inlineThreshold?: number;\n /** Live progress: called as files finish parsing (done of total). */\n onProgress?: (done: number, total: number) => void;\n /** `--grammars <dir>` override for the grammar .wasm files (offline/air-gapped). */\n grammarsDir?: string;\n /** Heap budget (MiB) checked as parse results accumulate; 0/unset skips. */\n memoryBudgetMb?: number;\n}\n\nconst DEFAULT_INLINE_THRESHOLD = 24;\n\nexport async function parseFiles(\n files: DiscoveredFile[],\n options: ParseOptions = {},\n): Promise<FileParse[]> {\n const threshold = options.inlineThreshold ?? DEFAULT_INLINE_THRESHOLD;\n const cores = Math.max(1, os.cpus()?.length ?? 1);\n // Precedence: explicit option (--jobs) → VG_JOBS env → cores - 1. Capping\n // workers caps peak memory too (each worker holds its own grammar set).\n const jobs = Math.max(1, options.jobs ?? envJobs() ?? (Math.min(cores - 1, files.length) || 1));\n\n const workerFile = resolveWorkerFile();\n const useInline =\n options.inline === true ||\n jobs <= 1 ||\n files.length < threshold ||\n workerFile === null;\n\n if (useInline) {\n // Inline runs in this process — apply the override directly.\n if (options.grammarsDir) setGrammarsOverride(options.grammarsDir);\n return sortByRel(await parseInline(files, options));\n }\n return sortByRel(await parsePooled(files, jobs, workerFile, options));\n}\n\n/** Check the accumulating heap every this-many completed files — frequent\n * enough to abort before a crash, cheap enough to be free. */\nconst MEM_CHECK_EVERY = 64;\n\nasync function parseInline(files: DiscoveredFile[], options: ParseOptions): Promise<FileParse[]> {\n const { onProgress, memoryBudgetMb = 0 } = options;\n const out: FileParse[] = [];\n onProgress?.(0, files.length);\n for (const file of files) {\n try {\n const source = fs.readFileSync(file.abs, 'utf8');\n out.push(await parseSource(file.rel, file.lang.id, source));\n } catch (err) {\n out.push(emptyParse(file, `parse failed: ${(err as Error).message}`));\n }\n onProgress?.(out.length, files.length);\n if (out.length % MEM_CHECK_EVERY === 0) checkMemoryBudget('parse', memoryBudgetMb);\n }\n return out;\n}\n\nasync function parsePooled(\n files: DiscoveredFile[],\n jobs: number,\n workerFile: string,\n options: ParseOptions,\n): Promise<FileParse[]> {\n const { onProgress, grammarsDir, memoryBudgetMb = 0 } = options;\n // Dynamic import so tinypool isn't loaded for inline-only runs.\n const { default: Tinypool } = await import('tinypool');\n // VG_WORKER_HEAP_MB caps each worker's old-generation heap so one runaway\n // parse cannot swallow the whole machine; unset = platform default.\n const workerHeapMb = envWorkerHeapMb();\n const pool = new Tinypool({\n filename: workerFile,\n maxThreads: jobs,\n minThreads: 1,\n ...(workerHeapMb ? { resourceLimits: { maxOldGenerationSizeMb: workerHeapMb } } : {}),\n });\n try {\n // More, smaller buckets than threads → finer live progress + better load\n // balancing. Round-robin keeps shards balanced; the final sort makes the\n // output independent of bucket count, so determinism is unaffected.\n const total = files.length;\n const buckets = chunk(\n files.map<ParseTask>((f) => ({ rel: f.rel, abs: f.abs, lang: f.lang.id })),\n Math.min(total, jobs * 8),\n );\n let done = 0;\n onProgress?.(0, total);\n const results = await Promise.all(\n buckets.map((b) =>\n (pool.run({ tasks: b, grammarsDir }) as Promise<FileParse[]>).then((r) => {\n done += b.length;\n onProgress?.(done, total);\n // Results accumulate in *this* process; guard its heap as they land.\n checkMemoryBudget('parse', memoryBudgetMb);\n return r;\n }),\n ),\n );\n return results.flat();\n } catch (err) {\n if (isWorkerOom(err)) {\n throw new ResourceLimitError(\n `graph build stopped: a parse worker exceeded its ${workerHeapMb ?? '?'} MiB heap cap ` +\n `(VG_WORKER_HEAP_MB). Raise the cap, exclude the offending files (--exclude), or ` +\n `run single-threaded with --jobs 1.`,\n );\n }\n throw err;\n } finally {\n await pool.destroy();\n }\n}\n\nfunction isWorkerOom(err: unknown): boolean {\n const e = err as { code?: string; message?: string } | null;\n return e?.code === 'ERR_WORKER_OUT_OF_MEMORY' || /out of memory/i.test(e?.message ?? '');\n}\n\nfunction resolveWorkerFile(): string | null {\n // Only the compiled .js worker is runnable by a bare worker_thread. Under a\n // TS-only runner (vitest/tsx) the .js won't exist → fall back to inline.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidate = path.join(here, 'parse-worker.js');\n return fs.existsSync(candidate) ? candidate : null;\n}\n\nfunction chunk<T>(items: T[], buckets: number): T[][] {\n const out: T[][] = Array.from({ length: Math.min(buckets, items.length || 1) }, () => []);\n if (out.length === 0) return [];\n // Round-robin keeps shard sizes balanced regardless of file ordering.\n items.forEach((item, i) => out[i % out.length].push(item));\n return out.filter((c) => c.length > 0);\n}\n\nfunction sortByRel(parses: FileParse[]): FileParse[] {\n return parses.sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));\n}\n\nfunction emptyParse(file: DiscoveredFile, warning: string): FileParse {\n return {\n rel: file.rel,\n lang: file.lang.id,\n hash: '',\n bytes: 0,\n defs: [],\n calls: [],\n imports: [],\n heritage: [],\n typeRefs: [],\n guards: [],\n warnings: [warning],\n };\n}\n","import * as path from 'node:path';\nimport { nodeId, edgeId } from './ids.js';\nimport { relativeResolver, type ModuleResolver } from './module-resolver.js';\nimport { isTestFile } from './tests.js';\nimport type { FileParse } from './types.js';\nimport type { EdgeKind, GraphEdge, GraphNode, NodeKind, ResolverKind } from '../schema.js';\n\n/**\n * Resolution: turn per-file symbol/edge tables into a connected graph of nodes\n * and typed, id'd edges.\n *\n * The Phase-0 resolver is the deterministic **heuristic** rung of the ladder\n * (VG-ENGINE-TEARDOWN §3.2). It is already well beyond Graphify's\n * single-candidate label match: it is scope-aware (same-file first), import-aware\n * (callees reachable through imported files next), and arity/visibility-honest\n * (records its confidence and resolution rung per edge rather than silently\n * dropping ambiguity). SCIP/stack-graphs rungs slot in above it later, recorded\n * via `edge.resolution`.\n */\n\n/**\n * A reference the heuristic resolver could not connect to a definition — the raw\n * material for `vg unknowns`. `from` is the node id of the enclosing definition\n * (or file) where the reference occurs; `name` is the callee/type it names. We\n * keep the source-relative path so a later precise rung that covers this file can\n * suppress the unknown (the compiler is authoritative there).\n */\nexport interface UnresolvedRef {\n from: string;\n name: string;\n kind: 'call' | 'extends' | 'implements';\n count: number;\n fromRel: string;\n}\n\nexport interface ResolveResult {\n nodes: GraphNode[];\n edges: GraphEdge[];\n /** References the heuristic rung could not resolve (deduped, sorted). */\n unresolved: UnresolvedRef[];\n /** Diagnostic counts, surfaced by `vg status`. */\n stats: {\n callsResolved: number;\n callsUnresolved: number;\n importsResolvedToFile: number;\n importsExternal: number;\n resolvers: ResolverKind[];\n };\n}\n\ninterface DefNodeRef {\n id: string;\n name: string;\n qualifiedName: string;\n rel: string;\n lang: string;\n kind: NodeKind;\n startByte: number; // for enclosing-scope lookup (not persisted)\n endByte: number;\n}\n\n// A partial node we fill analysis fields onto later (centrality/area/etc.).\ntype BaseNode = Omit<\n GraphNode,\n 'importance' | 'centrality' | 'area' | 'isHub' | 'tested' | 'coverage' | 'changeCoupling'\n>;\n\nexport function resolve(parses: FileParse[], resolver?: ModuleResolver): ResolveResult {\n const baseNodes = new Map<string, BaseNode>();\n const relSet = new Set(parses.map((p) => p.rel));\n // Default to relative-only resolution; build.ts passes a full resolver that\n // also follows tsconfig path aliases and workspace-package names.\n const mod = resolver ?? relativeResolver(relSet);\n\n // Index of definitions for resolution.\n const defsByName = new Map<string, DefNodeRef[]>(); // short name → defs\n const defsByFile = new Map<string, DefNodeRef[]>(); // rel → defs\n const fileNodeIdByRel = new Map<string, string>();\n\n // --- 1. file + definition nodes ---\n for (const p of parses) {\n const fileId = nodeId({ kind: 'file', qualifiedName: p.rel, file: p.rel });\n fileNodeIdByRel.set(p.rel, fileId);\n addNode(baseNodes, {\n id: fileId,\n kind: 'file',\n name: path.posix.basename(p.rel),\n qualifiedName: p.rel,\n file: p.rel,\n span: { start: 1, end: 1 },\n lang: p.lang,\n });\n\n for (const d of p.defs) {\n const id = nodeId({\n kind: d.kind,\n qualifiedName: d.qualifiedName,\n file: p.rel,\n signature: d.signature,\n });\n addNode(baseNodes, {\n id,\n kind: d.kind,\n name: d.name,\n qualifiedName: d.qualifiedName,\n file: p.rel,\n span: { start: d.startLine, end: d.endLine },\n lang: p.lang,\n signature: d.signature,\n doc: d.doc,\n });\n const ref: DefNodeRef = {\n id,\n name: d.name,\n qualifiedName: d.qualifiedName,\n rel: p.rel,\n lang: p.lang,\n kind: d.kind,\n startByte: d.startByte,\n endByte: d.endByte,\n };\n push(defsByName, d.name, ref);\n push(defsByFile, p.rel, ref);\n }\n }\n\n // --- namespace reachability (C#-style: a namespace is decoupled from the\n // directory, so cross-directory refs resolve through `using`, not co-location).\n // filesByNamespace: which files declare types in a namespace. nsReachableByRel:\n // for each file, the files reachable through a namespace it declares (same\n // namespace, split across files/dirs) or `using`-imports.\n const filesByNamespace = new Map<string, Set<string>>();\n for (const p of parses) for (const ns of p.namespaces ?? []) addToSet(filesByNamespace, ns, p.rel);\n const relsByLang = new Map<string, string[]>();\n for (const p of parses) push(relsByLang, p.lang, p.rel);\n // EXPLICIT namespace reachability (a shared namespace, or a `using`/`import`\n // of the target's namespace). Strong enough to justify a unique-name match —\n // the developer named the scope.\n const nsReachableByRel = new Map<string, Set<string>>();\n // IMPLICIT whole-module reachability (Swift: every file in the module sees the\n // others with no import). Too broad to justify a unique-name match — used ONLY\n // to let the heritage-anchored interface/implementation disambiguation see the\n // conforming type. Otherwise a lone same-named symbol anywhere in the repo\n // would wrongly resolve (the precision guard covers exactly this).\n const moduleReachableByRel = new Map<string, Set<string>>();\n for (const p of parses) {\n if (MODULE_SCOPED_LANGS.has(p.lang)) {\n const mod = new Set<string>();\n for (const rel of relsByLang.get(p.lang) ?? []) if (rel !== p.rel) mod.add(rel);\n moduleReachableByRel.set(p.rel, mod);\n }\n const reach = new Set<string>();\n const namespaces = new Set<string>(p.namespaces ?? []);\n for (const imp of p.imports) {\n namespaces.add(imp.source); // C# `using X.Y` names the namespace directly\n // Java/Kotlin/Scala `import a.b.Foo` names a CLASS, so the package (its\n // dotted parent) is what becomes reachable. Only matched candidates that\n // are ACTUALLY declared namespaces survive, so this never invents scope.\n if (IMPORT_NAMES_A_TYPE.has(p.lang)) {\n const sep = Math.max(imp.source.lastIndexOf('.'), imp.source.lastIndexOf('\\\\'));\n if (sep > 0) namespaces.add(imp.source.slice(0, sep));\n }\n }\n for (const ns of namespaces) for (const rel of filesByNamespace.get(ns) ?? []) if (rel !== p.rel) reach.add(rel);\n nsReachableByRel.set(p.rel, reach);\n }\n\n // --- interface/implementation index: type name → the super types it declares\n // (`class Foo : IFoo` → Foo⇒{IFoo}). Anchors DI call disambiguation on a real\n // heritage declaration, so `_svc.M()` (ambiguous between an interface method\n // and its implementation) resolves to the concrete implementation instead of\n // being dropped — the exact reason DI-wired services looked like orphans.\n const superTypesByType = new Map<string, Set<string>>();\n for (const p of parses) {\n const localDefs = defsByFile.get(p.rel) ?? [];\n for (const h of p.heritage) {\n const encl = enclosingDefRef(localDefs, h.byte);\n if (encl && (encl.kind === 'class' || encl.kind === 'interface')) addToSet(superTypesByType, encl.name, h.superName);\n }\n }\n\n const edges = new EdgeSet();\n const unresolved = new Map<string, UnresolvedRef>();\n const stats: ResolveResult['stats'] = {\n callsResolved: 0,\n callsUnresolved: 0,\n importsResolvedToFile: 0,\n importsExternal: 0,\n resolvers: ['heuristic'],\n };\n\n // --- 2. contains edges (file → top-level def, def → nested def) ---\n for (const p of parses) {\n const fileId = fileNodeIdByRel.get(p.rel)!;\n const localByQn = new Map<string, string>();\n for (const ref of defsByFile.get(p.rel) ?? []) localByQn.set(ref.qualifiedName, ref.id);\n for (const d of p.defs) {\n const id = localByQn.get(d.qualifiedName)!;\n const parentQn = parentQualifiedName(d.qualifiedName);\n const parentId = parentQn ? localByQn.get(parentQn) : undefined;\n edges.add('contains', parentId ?? fileId, id, 'heuristic', 1.0);\n }\n }\n\n // --- 3. import edges (file → file | external) ---\n const importedFilesByRel = new Map<string, Set<string>>();\n for (const p of parses) {\n const fileId = fileNodeIdByRel.get(p.rel)!;\n const importedRels = new Set<string>();\n for (const imp of p.imports) {\n const targetRel = mod.resolve(p.rel, imp.source);\n if (targetRel && targetRel !== p.rel) {\n importedRels.add(targetRel);\n edges.add('import', fileId, fileNodeIdByRel.get(targetRel)!, 'heuristic', 0.9);\n stats.importsResolvedToFile++;\n } else {\n const extId = ensureExternalNode(baseNodes, imp.source);\n edges.add('import', fileId, extId, 'heuristic', 1.0);\n stats.importsExternal++;\n }\n }\n importedFilesByRel.set(p.rel, importedRels);\n }\n\n // --- 4. call edges (heuristic resolution ladder) ---\n for (const p of parses) {\n const fileId = fileNodeIdByRel.get(p.rel)!;\n const localDefs = defsByFile.get(p.rel) ?? [];\n const imported = importedFilesByRel.get(p.rel) ?? new Set<string>();\n const testCaller = isTestFile(p.rel);\n const nsReach = nsReachableByRel.get(p.rel) ?? new Set<string>();\n const modReach = moduleReachableByRel.get(p.rel) ?? new Set<string>();\n for (const call of p.calls) {\n const srcId = enclosingDefId(localDefs, call.byte) ?? fileId;\n const resolved = resolveCall(call, p.rel, p.lang, imported, defsByName, srcId, testCaller, nsReach, superTypesByType, modReach);\n if (resolved) {\n edges.add('call', srcId, resolved.id, 'heuristic', resolved.confidence);\n stats.callsResolved++;\n } else {\n stats.callsUnresolved++;\n bumpUnresolved(unresolved, srcId, call.callee, 'call', p.rel);\n }\n }\n }\n\n // --- 4b. type-reference edges (constructor/field DI wiring, not a call) ---\n // A constructor parameter or field's declared type is a structural\n // dependency even when it's never invoked directly (Spring-style injection).\n // Most misses here are JDK/stdlib types (String, List, …) with no local\n // definition — expected and not actionable, so unlike calls/heritage these\n // don't get tracked as `unresolved` (it would swamp `vg unknowns`).\n for (const p of parses) {\n const fileId = fileNodeIdByRel.get(p.rel)!;\n const localDefs = defsByFile.get(p.rel) ?? [];\n const imported = importedFilesByRel.get(p.rel) ?? new Set<string>();\n const testCaller = isTestFile(p.rel);\n const nsReach = nsReachableByRel.get(p.rel) ?? new Set<string>();\n const modReach = moduleReachableByRel.get(p.rel) ?? new Set<string>();\n for (const ref of p.typeRefs) {\n const srcId = enclosingDefId(localDefs, ref.byte) ?? fileId;\n const target = resolveType(ref.name, p.rel, p.lang, imported, defsByName, testCaller, nsReach, modReach);\n if (target) edges.add('references', srcId, target.id, 'heuristic', 0.7);\n }\n }\n\n // --- 5. heritage edges (extends / implements) ---\n for (const p of parses) {\n const localDefs = defsByFile.get(p.rel) ?? [];\n const imported = importedFilesByRel.get(p.rel) ?? new Set<string>();\n const testCaller = isTestFile(p.rel);\n for (const h of p.heritage) {\n const srcId = enclosingDefId(localDefs, h.byte);\n if (!srcId) continue;\n const nsReach = nsReachableByRel.get(p.rel) ?? new Set<string>();\n const modReach = moduleReachableByRel.get(p.rel) ?? new Set<string>();\n const target = resolveType(h.superName, p.rel, p.lang, imported, defsByName, testCaller, nsReach, modReach);\n if (target) edges.add(h.kind as EdgeKind, srcId, target.id, 'heuristic', 0.85);\n else bumpUnresolved(unresolved, srcId, h.superName, h.kind as 'extends' | 'implements', p.rel);\n }\n }\n\n // Finalise: assemble GraphNodes (analysis fields filled later by analyze()).\n // `tested` is null in Phase 0 (not yet analyzed); test-awareness lands in\n // Phase 2 and will set true/false for analyzable nodes.\n const nodes: GraphNode[] = [...baseNodes.values()].map((n) => ({\n ...n,\n importance: 0,\n centrality: { degree: 0, pagerank: 0, betweenness: 0, eigenvector: 0 },\n area: 0,\n isHub: false,\n tested: null,\n }));\n\n const unresolvedList = [...unresolved.values()].sort(\n (a, b) =>\n a.from.localeCompare(b.from) || a.kind.localeCompare(b.kind) || a.name.localeCompare(b.name),\n );\n\n return { nodes, edges: edges.toArray(), unresolved: unresolvedList, stats };\n}\n\n// --- helpers ---\n\n/** Accumulate an unresolved reference, deduped by (from, kind, name) with a count. */\nfunction bumpUnresolved(\n map: Map<string, UnresolvedRef>,\n from: string,\n name: string,\n kind: UnresolvedRef['kind'],\n fromRel: string,\n): void {\n const key = `${from}\u0000${kind}\u0000${name}`;\n const existing = map.get(key);\n if (existing) existing.count++;\n else map.set(key, { from, name, kind, count: 1, fromRel });\n}\n\nfunction addNode(map: Map<string, BaseNode>, n: BaseNode): void {\n if (!map.has(n.id)) map.set(n.id, n);\n}\n\nfunction ensureExternalNode(map: Map<string, BaseNode>, source: string): string {\n const id = nodeId({ kind: 'external', qualifiedName: source, file: '' });\n if (!map.has(id)) {\n map.set(id, {\n id,\n kind: 'external',\n name: source,\n qualifiedName: source,\n file: '',\n span: { start: 1, end: 1 },\n lang: 'external',\n });\n }\n return id;\n}\n\nfunction push<T>(map: Map<string, T[]>, key: string, value: T): void {\n const list = map.get(key);\n if (list) list.push(value);\n else map.set(key, [value]);\n}\n\nfunction parentQualifiedName(qn: string): string | null {\n const idx = qn.lastIndexOf('.');\n return idx > 0 ? qn.slice(0, idx) : null;\n}\n\nfunction enclosingDefRef(defs: DefNodeRef[], byte: number): DefNodeRef | undefined {\n let best: DefNodeRef | undefined;\n for (const d of defs) {\n if (d.startByte <= byte && d.endByte >= byte) {\n if (!best || d.endByte - d.startByte < best.endByte - best.startByte) best = d;\n }\n }\n return best;\n}\n\nfunction enclosingDefId(defs: DefNodeRef[], byte: number): string | undefined {\n return enclosingDefRef(defs, byte)?.id;\n}\n\nfunction addToSet(map: Map<string, Set<string>>, key: string, value: string): void {\n const s = map.get(key);\n if (s) s.add(value);\n else map.set(key, new Set([value]));\n}\n\n/** The declaring type of a method, from its dotted qualified name (`Foo.bar` → `Foo`). */\nfunction parentTypeName(qualifiedName: string): string | null {\n const i = qualifiedName.lastIndexOf('.');\n return i > 0 ? qualifiedName.slice(0, i) : null;\n}\n\n/**\n * Disambiguate an interface/implementation family among same-named candidate\n * methods, anchored on real heritage (`class Impl : IFace`):\n * - exactly one implementation → resolve to it (the concrete runtime target,\n * so impact_of/tests_for/find_path on the service work);\n * - several implementations of one interface → resolve to the interface method\n * (the stable contract) rather than fan out to every impl or pick arbitrarily;\n * - not an interface/impl family → null (stay honestly ambiguous).\n * Returns the chosen def, or null when the pool is not a single such family.\n */\nfunction disambiguateInterfaceImpl(\n pool: DefNodeRef[],\n superTypesByType: Map<string, Set<string>>,\n): DefNodeRef | null {\n const withParent = pool\n .map((c) => ({ c, parent: parentTypeName(c.qualifiedName) }))\n .filter((x): x is { c: DefNodeRef; parent: string } => x.parent !== null);\n if (withParent.length < 2) return null;\n const parents = new Set(withParent.map((x) => x.parent));\n // An impl candidate: its parent type declares (implements/extends) another\n // candidate's parent type.\n const impls = withParent.filter((x) =>\n [...parents].some((other) => other !== x.parent && superTypesByType.get(x.parent)?.has(other)),\n );\n if (impls.length === 0) return null;\n // The interface(s) those impls satisfy (a candidate whose parent is a super of an impl's parent).\n const interfaceParents = new Set<string>();\n for (const impl of impls) for (const s of superTypesByType.get(impl.parent) ?? []) interfaceParents.add(s);\n const interfaces = withParent.filter((x) => interfaceParents.has(x.parent));\n const uniqueImplIds = new Set(impls.map((x) => x.c.id));\n if (uniqueImplIds.size === 1) return impls[0].c;\n const uniqueIfaceIds = new Set(interfaces.map((x) => x.c.id));\n if (uniqueIfaceIds.size === 1) return interfaces[0].c;\n return null;\n}\n\n/**\n * Languages where definitions in the same directory share a visibility scope\n * (package / namespace) and reference each other WITHOUT an import — so a\n * same-directory match is justified resolution, not a guess:\n * - Go: a package IS a directory; all files in it see each other's identifiers.\n * - Java: same-package classes (package == directory by convention).\n * - C#: file-scoped/co-located namespaces commonly align with the directory.\n * - Kotlin/Scala: Java-style package visibility (package == directory by convention).\n * - Swift: module-wide visibility; files in one target see each other un-imported.\n * TS/JS, Python, Ruby, PHP, Dart, Lua, Elixir, Shell, Zig, C and C++ require an\n * explicit import/include for cross-file refs, so they get NO directory rung —\n * a same-name def elsewhere is not reachable.\n */\nconst PACKAGE_SCOPED_LANGS = new Set(['go', 'java', 'cs', 'kotlin', 'scala', 'swift']);\n\n/** Languages whose `import` names a TYPE (not a namespace), so the reachable\n * namespace is the import's parent (`import a.b.Foo` → package `a.b`, PHP\n * `use A\\B\\Foo` → namespace `A\\B`). Separator is `.` except PHP's `\\`. */\nconst IMPORT_NAMES_A_TYPE = new Set(['java', 'kotlin', 'scala', 'php']);\n\n/** Languages with whole-module visibility — every file in the module sees the\n * others' top-level symbols with no import (Swift). Treated as one module. */\nconst MODULE_SCOPED_LANGS = new Set(['swift']);\n\nfunction dirOf(rel: string): string {\n const i = rel.lastIndexOf('/');\n return i >= 0 ? rel.slice(0, i) : '';\n}\n\n/**\n * The heuristic call resolution ladder. A call resolves only when the target is\n * *reachable*: same-file scope, an imported file, or — for package-scoped\n * languages — the same package directory. There is deliberately NO \"single\n * global definition with this name\" fallback: that rung produced the dominant\n * class of false positives (every `fetch()` linking to a lone repo method named\n * `fetch`, every `parse()` to an unrelated `Parser.parse`). Honest\n * non-resolution (null) beats a wrong edge that corrupts centrality, areas and\n * impact; the SCIP/tsc rungs recover the precise edge where a user needs it.\n */\nfunction resolveCall(\n call: { callee: string; qualified?: boolean },\n fromRel: string,\n fromLang: string,\n importedRels: Set<string>,\n defsByName: Map<string, DefNodeRef[]>,\n enclosingId?: string,\n fromIsTestFile = false,\n nsReachableRels: Set<string> = new Set(),\n superTypesByType: Map<string, Set<string>> = new Map(),\n moduleReachableRels: Set<string> = new Set(),\n): { id: string; confidence: number } | null {\n const candidates = defsByName.get(call.callee);\n if (!candidates || candidates.length === 0) return null;\n\n const callable = candidates.filter((c) => c.kind === 'function' || c.kind === 'method');\n const pool = callable.length ? callable : candidates;\n\n // 1. Same-file scope (the strongest signal). A *qualified* call (`crud.foo()`)\n // must not match the enclosing def itself: the parser drops the receiver, so a\n // handler `foo` that delegates to `module.foo(...)` would otherwise resolve to\n // *itself* — on FastAPI/Django-style codebases that false self-loop was the\n // dominant edge (100% of resolved calls in one corpus repo). A bare `foo()`\n // inside `foo` is still honest recursion and is kept.\n let sameFile = pool.filter((c) => c.rel === fromRel);\n if (call.qualified && enclosingId) sameFile = sameFile.filter((c) => c.id !== enclosingId);\n if (sameFile.length === 1) return { id: sameFile[0].id, confidence: 0.85 };\n if (sameFile.length > 1) {\n // Overloads/redefinitions in one file — pick deterministically, low confidence.\n const pick = [...sameFile].sort((a, b) => a.id.localeCompare(b.id))[0];\n return { id: pick.id, confidence: 0.4 };\n }\n\n // 2. Reachable-candidate resolution, in two tiers of trust.\n //\n // STRICT reachability (imported file, same package directory, or an\n // explicitly named namespace) is strong enough to resolve a UNIQUE match —\n // the developer named the scope. Unified into one pool BEFORE deciding, so\n // a DI call reaches the concrete implementation even when only the interface\n // was directly imported (interface via `import`, impl via its package) —\n // the ordering that previously stopped at the interface method.\n const dir = dirOf(fromRel);\n const notSelf = (c: DefNodeRef): boolean => !(call.qualified && enclosingId && c.id === enclosingId);\n const strict = pool.filter(\n (c) =>\n notSelf(c) &&\n (importedRels.has(c.rel) ||\n (PACKAGE_SCOPED_LANGS.has(fromLang) && c.lang === fromLang && dirOf(c.rel) === dir) ||\n nsReachableRels.has(c.rel)),\n );\n if (strict.length === 1) return { id: strict[0].id, confidence: 0.75 };\n\n // The DISAMBIGUATION pool additionally admits whole-module reachability\n // (Swift) — too broad for a unique-name match, but fine for the\n // heritage-anchored interface/implementation family, which requires a real\n // `implements`/`extends` declaration and so cannot fire on an unrelated\n // same-named symbol. Resolve a DI family to the concrete implementation.\n const broad = pool.filter((c) => notSelf(c) && (moduleReachableRels.has(c.rel) || strict.includes(c)));\n if (broad.length > 1) {\n const dedup = disambiguateInterfaceImpl(broad, superTypesByType);\n if (dedup) return { id: dedup.id, confidence: 0.6 };\n }\n // Ambiguous within STRICT scope with no interface/impl resolution → do not\n // guess (the \"lone global match\" false-positive class stays out).\n if (strict.length > 1) return null;\n\n // 4. Swift-only test-file fallback. Xcode test targets commonly live in a\n // sibling `Tests/` tree, not the product code's directory, so rung 3's\n // same-directory check never reaches them even though the whole module is\n // visible unimported — the dominant cause of `tests_for` undercounting a\n // class that a test directly constructs (including via a local helper).\n // Gated on the *caller* being test code (this only adds test-linkage/call\n // visibility, never a product-to-product edge) and an unambiguous\n // repo-wide name match, so it can't reintroduce the \"lone global match\"\n // false-positive class rung 4 elsewhere refuses to guess.\n if (fromLang === 'swift' && fromIsTestFile && pool.length === 1) {\n return { id: pool[0].id, confidence: 0.5 };\n }\n\n // 5. No reachability justification → do not guess (precision over recall).\n return null;\n}\n\n/** Heritage/type-reference resolution — same reachability rule as calls. */\nfunction resolveType(\n name: string,\n fromRel: string,\n fromLang: string,\n importedRels: Set<string>,\n defsByName: Map<string, DefNodeRef[]>,\n fromIsTestFile = false,\n nsReachableRels: Set<string> = new Set(),\n moduleReachableRels: Set<string> = new Set(),\n): { id: string } | null {\n const candidates = (defsByName.get(name) ?? []).filter(\n (c) => c.kind === 'class' || c.kind === 'interface',\n );\n if (candidates.length === 0) return null;\n\n const sameFile = candidates.filter((c) => c.rel === fromRel);\n if (sameFile.length === 1) return { id: sameFile[0].id };\n\n const imported = candidates.filter((c) => importedRels.has(c.rel));\n if (imported.length === 1) return { id: imported[0].id };\n if (imported.length > 1) return null;\n\n if (PACKAGE_SCOPED_LANGS.has(fromLang)) {\n const dir = dirOf(fromRel);\n const samePkg = candidates.filter((c) => c.lang === fromLang && dirOf(c.rel) === dir);\n if (samePkg.length === 1) return { id: samePkg[0].id };\n }\n\n // Namespace / whole-module reachable type: the type's file declares a\n // namespace this file `using`/`import`s or shares (C#/JVM), or is in the same\n // module (Swift). An explicit type annotation naming a unique reachable type\n // is unambiguous — this is not a call, so the lone-name-call precision guard\n // does not apply. A type name matching two reachable types stays unresolved.\n if (nsReachableRels.size || moduleReachableRels.size) {\n const reach = candidates.filter((c) => nsReachableRels.has(c.rel) || moduleReachableRels.has(c.rel));\n if (reach.length === 1) return { id: reach[0].id };\n }\n\n // Swift-only test-file fallback — see the matching rung in resolveCall.\n if (fromLang === 'swift' && fromIsTestFile && candidates.length === 1) {\n return { id: candidates[0].id };\n }\n return null; // no global single-match fallback (false-positive source)\n}\n\n/** Accumulates edges, deduping on (kind, src, dst) and counting multiplicity. */\nclass EdgeSet {\n private map = new Map<string, GraphEdge>();\n\n add(kind: EdgeKind, src: string, dst: string, resolution: ResolverKind, confidence: number): void {\n const id = edgeId(kind, src, dst);\n const existing = this.map.get(id);\n if (existing) {\n existing.count = (existing.count ?? 1) + 1;\n // Keep the highest confidence seen for this logical edge.\n if (confidence > existing.confidence) existing.confidence = confidence;\n return;\n }\n this.map.set(id, { id, kind, src, dst, resolution, confidence, count: 1 });\n }\n\n toArray(): GraphEdge[] {\n return [...this.map.values()].sort(\n (a, b) =>\n a.kind.localeCompare(b.kind) || a.src.localeCompare(b.src) || a.dst.localeCompare(b.dst),\n );\n }\n}\n","import * as path from 'node:path';\nimport ts from 'typescript';\nimport { edgeId } from './ids.js';\nimport type { EdgeKind, GraphEdge, GraphNode, NodeKind, ResolverKind } from '../schema.js';\n\n/**\n * Precise TS/JS resolution via the TypeScript Compiler API — the type checker\n * itself, in-process, no external tool, `typescript` already a dependency. It\n * resolves `this.x()`, member calls, imported/aliased calls and heritage\n * exactly, which the heuristic rung structurally cannot (real codebases are\n * dominated by member calls → 0% heuristic resolution). Default-on for TS/JS.\n *\n * Deterministic: a ts.Program over the same files + options + compiler version\n * yields the same resolution; edges are stably sorted. Edges carry\n * `resolution: \"tsc\"`, confidence 1.0, and are authoritative for covered files.\n */\n\nconst PRECISE_KIND = 'tsc' satisfies ResolverKind;\n\nexport interface TsResolveResult {\n edges: GraphEdge[];\n /** Repo-relative files the program covered (tsc is authoritative for these). */\n coveredFiles: Set<string>;\n stats: { files: number; calls: number; jsx: number; heritage: number; resolved: number };\n}\n\nexport function tsResolveEdges(\n root: string,\n tsFiles: { rel: string; abs: string }[],\n nodes: GraphNode[],\n): TsResolveResult {\n const empty: TsResolveResult = {\n edges: [],\n coveredFiles: new Set(),\n stats: { files: 0, calls: 0, jsx: 0, heritage: 0, resolved: 0 },\n };\n if (tsFiles.length === 0) return empty;\n\n const absToRel = new Map(tsFiles.map((f) => [normalize(f.abs), f.rel]));\n const options = compilerOptions(root);\n let program: ts.Program;\n try {\n program = ts.createProgram(tsFiles.map((f) => f.abs), options);\n } catch {\n return empty; // never let resolution break the build\n }\n const checker = program.getTypeChecker();\n\n const nodesByFile = new Map<string, GraphNode[]>();\n const fileNodeByRel = new Map<string, GraphNode>();\n for (const n of nodes) {\n if (n.kind === 'file') {\n fileNodeByRel.set(n.file, n);\n continue;\n }\n if (n.kind === 'external') continue;\n const list = nodesByFile.get(n.file);\n if (list) list.push(n);\n else nodesByFile.set(n.file, [n]);\n }\n\n const relForAbs = (abs: string): string | undefined => absToRel.get(normalize(abs));\n const edges = new Map<string, GraphEdge>();\n const covered = new Set<string>();\n const stats = empty.stats;\n // A method call on an interface-typed receiver resolves to the interface (its\n // method signatures are not graph nodes), so DI-injected services never got a\n // call edge to the concrete implementation. Record such calls and, once all\n // `implements` edges are known, bridge each to the SINGLE implementation's\n // matching method — the DI reality (the impl choice lives in module config,\n // not the caller). Only when exactly one class implements the interface, so it\n // never guesses among several. { srcId, interfaceId, method } tuples.\n const interfaceCalls: Array<{ srcId: string; interfaceId: string; method: string }> = [];\n const byId = new Map<string, GraphNode>();\n for (const list of nodesByFile.values()) for (const n of list) byId.set(n.id, n);\n\n for (const file of tsFiles) {\n const sf = program.getSourceFile(file.abs);\n if (!sf) continue;\n covered.add(file.rel);\n stats.files++;\n const fileNodes = nodesByFile.get(file.rel) ?? [];\n const fileNode = fileNodeByRel.get(file.rel);\n\n const lineOf = (pos: number): number => sf.getLineAndCharacterOfPosition(pos).line + 1;\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) || ts.isNewExpression(node)) {\n stats.calls++;\n const target = resolveTarget(checker, node.expression, nodesByFile, relForAbs);\n if (target) {\n // Attribute to the enclosing def, falling back to the file node for\n // top-level calls — mirrors the heuristic so test-linkage and\n // centrality see the same call granularity.\n const src = enclosing(fileNodes, lineOf(node.getStart(sf))) ?? fileNode;\n if (src && src.id !== target.id) {\n add(edges, callKind(target), src.id, target.id);\n stats.resolved++;\n // Interface-typed method call (`svc.method()` where svc: IFoo): the\n // target is the interface node, and the method name is the accessed\n // property. Record it for the single-implementation bridge below.\n if (target.kind === 'interface' && ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {\n interfaceCalls.push({ srcId: src.id, interfaceId: target.id, method: node.expression.name.text });\n }\n }\n }\n } else if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {\n // JSX component usage (`<Foo/>`) is a render — a call in the graph.\n // Dominant cross-module link in React/Next code, which the heuristic and\n // a CallExpression-only walk both miss. Lowercase tags are intrinsic\n // HTML elements and resolve to nothing in-repo (skipped).\n if (isComponentTag(node.tagName)) {\n stats.jsx++;\n const target = resolveTarget(checker, node.tagName, nodesByFile, relForAbs);\n if (target) {\n const src = enclosing(fileNodes, lineOf(node.getStart(sf))) ?? fileNode;\n if (src && src.id !== target.id) {\n add(edges, callKind(target), src.id, target.id);\n stats.resolved++;\n }\n }\n }\n } else if (ts.isClassDeclaration(node) && node.heritageClauses) {\n const classLine = lineOf(node.getStart(sf));\n const src = enclosing(fileNodes, classLine);\n for (const clause of node.heritageClauses) {\n const kind: EdgeKind = clause.token === ts.SyntaxKind.ImplementsKeyword ? 'implements' : 'extends';\n for (const t of clause.types) {\n stats.heritage++;\n const target = resolveTarget(checker, t.expression, nodesByFile, relForAbs);\n if (src && target && src.id !== target.id) {\n add(edges, kind, src.id, target.id);\n stats.resolved++;\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sf);\n }\n\n // Single-implementation bridge: for each interface with EXACTLY ONE\n // implementing class, redirect its recorded interface-typed calls to the\n // implementation's matching method. This is the DI edge that makes impact_of /\n // tests_for / find_path work on the concrete service. Skipped when an\n // interface has zero or several implementations (genuinely ambiguous — the\n // references→interface edge already recorded the dependency).\n const implsByInterface = new Map<string, string[]>();\n for (const e of edges.values()) {\n if (e.kind !== 'implements' && e.kind !== 'extends') continue;\n if (byId.get(e.dst)?.kind !== 'interface') continue;\n const list = implsByInterface.get(e.dst);\n if (list) list.push(e.src);\n else implsByInterface.set(e.dst, [e.src]);\n }\n for (const { srcId, interfaceId, method } of interfaceCalls) {\n const impls = implsByInterface.get(interfaceId);\n if (!impls || impls.length !== 1) continue;\n const impl = byId.get(impls[0]);\n if (!impl) continue;\n const target = (nodesByFile.get(impl.file) ?? []).find(\n (n) => (n.kind === 'method' || n.kind === 'function') && n.qualifiedName === `${impl.qualifiedName}.${method}`,\n );\n if (target && target.id !== srcId) {\n add(edges, 'call', srcId, target.id);\n stats.resolved++;\n }\n }\n\n return { edges: [...edges.values()], coveredFiles: covered, stats };\n}\n\n/** A render/invoke target (function/method/class/component) is a `call`; other\n * kinds (interface/property/…) are `references`. */\nfunction callKind(target: GraphNode): EdgeKind {\n return target.kind === 'function' ||\n target.kind === 'method' ||\n target.kind === 'class' ||\n target.kind === 'component'\n ? 'call'\n : 'references';\n}\n\n/** Is a JSX tag a component (resolvable in-repo) vs an intrinsic HTML element? */\nfunction isComponentTag(tag: ts.JsxTagNameExpression): boolean {\n if (ts.isIdentifier(tag)) return /^[A-Z]/.test(tag.text);\n // `<Namespace.Component/>` / `<obj.Member/>` — a property access is a component ref.\n return ts.isPropertyAccessExpression(tag);\n}\n\nfunction resolveTarget(\n checker: ts.TypeChecker,\n expr: ts.Node,\n nodesByFile: Map<string, GraphNode[]>,\n relForAbs: (abs: string) => string | undefined,\n): GraphNode | null {\n let sym = checker.getSymbolAtLocation(expr);\n if (!sym) return null;\n if (sym.flags & ts.SymbolFlags.Alias) {\n try {\n sym = checker.getAliasedSymbol(sym);\n } catch {\n /* keep original */\n }\n }\n const decls = sym.declarations;\n if (!decls) return null;\n for (const decl of decls) {\n const df = decl.getSourceFile();\n const rel = relForAbs(df.fileName);\n if (!rel) continue; // declaration is external (node_modules / lib)\n const fileNodes = nodesByFile.get(rel);\n if (!fileNodes) continue;\n const line = df.getLineAndCharacterOfPosition(decl.getStart(df)).line + 1;\n // Pick the node for this declaration, using its syntax kind to disambiguate\n // when several nodes start on the same line (e.g. a single-line class and\n // its method) — the type checker knows whether we want the method or the\n // class, so a name/line collision never picks the wrong one.\n const node = pickNode(fileNodes, line, expectedKinds(decl));\n if (node) return node;\n }\n return null;\n}\n\n/** Node kinds a declaration could map to (for same-line tie-breaking). */\nfunction expectedKinds(decl: ts.Node): Set<NodeKind> {\n if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl)) return new Set(['method']);\n if (ts.isFunctionDeclaration(decl) || ts.isFunctionExpression(decl) || ts.isArrowFunction(decl)) {\n return new Set(['function', 'method', 'component']);\n }\n if (ts.isClassDeclaration(decl) || ts.isClassExpression(decl)) return new Set(['class', 'component']);\n if (ts.isInterfaceDeclaration(decl)) return new Set(['interface']);\n if (\n ts.isPropertyDeclaration(decl) ||\n ts.isPropertySignature(decl) ||\n ts.isGetAccessorDeclaration(decl) ||\n ts.isSetAccessorDeclaration(decl)\n ) {\n return new Set(['property', 'method']);\n }\n if (ts.isConstructorDeclaration(decl)) return new Set(['class', 'method']);\n if (ts.isVariableDeclaration(decl)) return new Set(['function', 'property', 'component']);\n return new Set();\n}\n\n/**\n * The node for a declaration at `line`: among nodes starting exactly there,\n * prefer one whose kind the declaration expects, then the smallest span, then\n * the lexicographically smaller id (a stable, order-independent tiebreak). Falls\n * back to the smallest enclosing node when nothing starts on that line.\n */\nfunction pickNode(nodes: GraphNode[], line: number, want: Set<NodeKind>): GraphNode | undefined {\n let best: GraphNode | undefined;\n for (const n of nodes) {\n if (n.span.start !== line) continue;\n if (!best || better(n, best, want)) best = n;\n }\n return best ?? enclosing(nodes, line);\n}\n\nfunction better(n: GraphNode, best: GraphNode, want: Set<NodeKind>): boolean {\n const nWanted = want.has(n.kind);\n const bWanted = want.has(best.kind);\n if (nWanted !== bWanted) return nWanted;\n const nSize = n.span.end - n.span.start;\n const bSize = best.span.end - best.span.start;\n if (nSize !== bSize) return nSize < bSize;\n return n.id < best.id;\n}\n\nfunction compilerOptions(root: string): ts.CompilerOptions {\n const base: ts.CompilerOptions = {\n allowJs: true,\n checkJs: false,\n skipLibCheck: true,\n noEmit: true,\n noResolve: false,\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n jsx: ts.JsxEmit.Preserve,\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n };\n // Honor the project's tsconfig (paths/baseUrl) for accurate module resolution.\n // Prefer tsconfig.json, then tsconfig.base.json (Nx/Turborepo), and follow\n // `extends` chains — real monorepos put path aliases in a base config that\n // per-package configs extend. getParsedCommandLineOfConfigFile resolves the\n // whole chain (parseJsonConfigFileContent does not).\n const configPath =\n ts.findConfigFile(root, ts.sys.fileExists, 'tsconfig.json') ??\n ts.findConfigFile(root, ts.sys.fileExists, 'tsconfig.base.json');\n if (configPath) {\n try {\n const host: ts.ParseConfigFileHost = {\n ...ts.sys,\n onUnRecoverableConfigFileDiagnostic: () => {\n /* tolerate broken config — fall back to base */\n },\n };\n const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, host);\n if (parsed) {\n // Keep the project's module map (baseUrl/paths) but force our read-only,\n // permissive compile settings on top so resolution is maximal.\n return { ...parsed.options, ...base, baseUrl: parsed.options.baseUrl, paths: parsed.options.paths };\n }\n } catch {\n /* fall back to base */\n }\n }\n return base;\n}\n\nfunction add(map: Map<string, GraphEdge>, kind: EdgeKind, src: string, dst: string): void {\n const id = edgeId(kind, src, dst);\n const existing = map.get(id);\n if (existing) {\n existing.count = (existing.count ?? 1) + 1;\n return;\n }\n map.set(id, { id, kind, src, dst, resolution: PRECISE_KIND, confidence: 1.0, count: 1 });\n}\n\nfunction enclosing(nodes: GraphNode[], line: number): GraphNode | undefined {\n let best: GraphNode | undefined;\n for (const n of nodes) {\n if (n.span.start <= line && n.span.end >= line) {\n if (!best || n.span.end - n.span.start < best.span.end - best.span.start) best = n;\n }\n }\n return best;\n}\n\nfunction normalize(p: string): string {\n return path.resolve(p).split(path.sep).join('/');\n}\n","import type { GraphEdge, NodeKind, ResolverKind } from '../schema.js';\n\n/**\n * Edge-level epistemic confidence.\n *\n * Tree-sitter gives syntax, not semantics: a call graph built purely from it is\n * name-matching — heuristic, i.e. conjecture wearing a deterministic costume.\n * Rather than hide that behind a single 0..1 `confidence`, every edge also\n * carries a coarse, honest *tier* describing HOW it was resolved, so a consumer\n * can filter for the assurance it needs (`WHERE epistemic = 'observed'`).\n *\n * observed — resolved by a semantic resolver (SCIP / stack-graphs / the\n * TypeScript type checker) to a concrete declaration, or a\n * structural fact read directly off the parse tree\n * (containment, an import that resolves to a corpus file).\n * name-matched — matched by symbol name only, with no reachability proof.\n * This is the heuristic call/heritage/reference graph: useful,\n * but conjecture, not observation.\n * declared — asserted by a manifest, config, or an external boundary the\n * graph does not model internally (external package imports,\n * test/coverage linkage). True as a declaration; not verified\n * against code.\n *\n * `epistemic` is the coarse honesty axis; the numeric `confidence` remains the\n * fine gradient within a tier. The tier is a pure, deterministic function of the\n * edge's own fields plus the kind of its destination node.\n */\nexport type EpistemicTier = 'observed' | 'name-matched' | 'declared';\n\nexport const EPISTEMIC_TIERS: readonly EpistemicTier[] = ['observed', 'name-matched', 'declared'];\n\n/** Semantic resolvers observe the real target; the heuristic rung only guesses it. */\nconst SEMANTIC_RESOLVERS = new Set<ResolverKind>(['scip', 'stackgraph', 'tsc']);\n\n/**\n * Classify one edge into its epistemic tier. `dstKind` is the destination node's\n * kind (used to tell an internal import from an external-package import); omit it\n * only when the destination is unknown, in which case imports fall back to\n * `declared` (the safer, less-assured label).\n */\nexport function classifyEpistemic(edge: GraphEdge, dstKind?: NodeKind): EpistemicTier {\n // A semantic resolver saw the concrete declaration — the strongest tier.\n if (SEMANTIC_RESOLVERS.has(edge.resolution)) return 'observed';\n\n switch (edge.kind) {\n case 'contains':\n // Direct syntactic containment from the parse tree — observed, not guessed.\n return 'observed';\n case 'import':\n // Resolved to a real file in the corpus is observed; a bare external\n // package reference is only declared (we never see inside it).\n return dstKind === 'external' || dstKind === undefined ? 'declared' : 'observed';\n case 'test':\n case 'coverage':\n // Asserted by test structure / a coverage report, not verified against\n // the runtime call graph.\n return 'declared';\n default:\n // call / extends / implements / references resolved by the heuristic rung:\n // a symbol-name match with no reachability justification.\n return 'name-matched';\n }\n}\n\n/** Count edges by epistemic tier (deterministic key order). */\nexport function epistemicBreakdown(edges: GraphEdge[]): Record<EpistemicTier, number> {\n const out: Record<EpistemicTier, number> = { observed: 0, 'name-matched': 0, declared: 0 };\n for (const e of edges) {\n if (e.epistemic) out[e.epistemic]++;\n }\n return out;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { discover, type DiscoveredFile } from './discover.js';\nimport { parseFiles } from './pool.js';\nimport { resolve } from './resolve.js';\nimport { buildModuleResolver } from './module-resolver.js';\nimport { tsResolveEdges } from './ts-resolver.js';\nimport { decodeScipIndex, scipEdges } from './scip.js';\nimport { analyze, type ClusterMode } from './analyze.js';\nimport { applyStaticTestLinkage } from './tests.js';\nimport { loadCoverage, applyCoverage } from './coverage.js';\nimport { buildFacts } from './facts.js';\nimport { groundGraph } from './grounding.js';\nimport { loadCache } from './cache.js';\nimport {\n resolveLimits,\n checkMemoryBudget,\n formatBytes,\n ResourceLimitError,\n type ResourceLimits,\n} from './limits.js';\nimport { hashString, hashBytes, canonicalize, shortId } from './hash.js';\nimport { grammarSetVersion } from './grammars.js';\nimport { classifyEpistemic } from './epistemic.js';\nimport { VERSION } from '../version.js';\nimport {\n SCHEMA_VERSION,\n type EdgeKind,\n type GraphEdge,\n type ResolverKind,\n type Toolchain,\n type VgGraph,\n} from '../schema.js';\nimport type { ScipIndex } from './scip.js';\nimport type { FileParse } from './types.js';\nimport type { ResolveResult } from './resolve.js';\n\nexport interface BuildOptions {\n /** Directory to build (default cwd). */\n root: string;\n /** Restrict to language ids. */\n only?: string[];\n /** Extra ignore globs (gitignore syntax). */\n exclude?: string[];\n /** Sub-paths to scope to. */\n paths?: string[];\n /** Worker count; 1 forces inline. */\n jobs?: number;\n /** Force single-threaded parsing. */\n inline?: boolean;\n /** Disable the incremental cache (full rebuild). */\n noCache?: boolean;\n /** Heavier open passes (recorded in provenance; Phase 1+ wires the analyses). */\n deep?: boolean;\n /** Community detection mode (default 'louvain'). */\n cluster?: ClusterMode;\n /** Coverage report paths (default: auto-detect lcov/istanbul). */\n coverage?: string[];\n /** Skip coverage ingestion. */\n noCoverage?: boolean;\n /** Skip grounding (free knowledge pack). Default: grounding on. */\n noGround?: boolean;\n /** Path to a SCIP index to ingest (default: auto-detect index.scip). */\n scip?: string;\n /** Skip SCIP ingestion even if an index is present. */\n noScip?: boolean;\n /** Skip the in-process TypeScript Compiler API resolver (heuristic floor only). */\n noTsc?: boolean;\n /** Pin the artifact timestamp for byte-deterministic output. */\n generatedAt?: string;\n /** Live progress during the parse phase (files done of total). */\n onParseProgress?: (done: number, total: number) => void;\n /** Override directory for grammar .wasm files (offline / air-gapped). */\n grammarsDir?: string;\n /** Resource-safeguard overrides (else VG_MAX_FILE_BYTES / VG_MAX_FILES /\n * VG_TSC_MAX_FILES / VG_MEMORY_BUDGET_MB env vars, else defaults). */\n limits?: Partial<ResourceLimits>;\n}\n\n/** Stat + content hash of one corpus file at build time. */\nexport interface FileStat {\n rel: string;\n size: number;\n mtimeMs: number;\n hash: string;\n}\n\nexport interface BuildResult {\n graph: VgGraph;\n timing: { totalMs: number };\n reparsed: number;\n reused: number;\n totalFiles: number;\n /** Stat+hash of every file in the corpus — input for the freshness snapshot. */\n fileStats: FileStat[];\n resolveStats: ResolveResult['stats'];\n /** Present when the TypeScript Compiler API resolver ran (TS/JS files). */\n tsc?: { files: number; calls: number; jsx: number; heritage: number; resolved: number };\n /** Present when a SCIP index was ingested. */\n scip?: { documents: number; references: number; resolved: number; tool?: string };\n warnings: string[];\n}\n\nexport async function buildGraph(options: BuildOptions): Promise<BuildResult> {\n const start = nowMs();\n const root = path.resolve(options.root);\n const files = discover({\n root,\n only: options.only,\n exclude: options.exclude,\n paths: options.paths,\n });\n\n // Resource safeguards (see limits.ts): stop a pathological corpus before it\n // OOM-kills the process. Skips are deterministic functions of the input.\n const limits = resolveLimits(options.limits);\n if (limits.maxFiles > 0 && files.length > limits.maxFiles) {\n throw new ResourceLimitError(\n `graph build stopped: ${files.length.toLocaleString()} files exceed the ` +\n `${limits.maxFiles.toLocaleString()}-file limit. Scope the build (pass sub-paths, add ` +\n `--exclude globs, or --only <langs>), or set VG_MAX_FILES to raise the limit ` +\n `(0 disables it).`,\n );\n }\n checkMemoryBudget('discovery', limits.memoryBudgetMb);\n\n const grammars = grammarSetVersion();\n const cache = loadCache(root, {\n toolVersion: VERSION,\n grammars,\n disabled: options.noCache,\n });\n\n // Hash every discovered file (cheap) and split into reuse vs reparse. The\n // stat is taken *before* the read so a mid-read edit shows up as a stat\n // mismatch on the next freshness probe (never a silently-missed change).\n const hashes = new Map<string, string>();\n const fileStats: FileStat[] = [];\n const toParse: DiscoveredFile[] = [];\n const reused: FileParse[] = [];\n const buildWarnings: string[] = [];\n for (const file of files) {\n let stat: fs.Stats;\n try {\n stat = fs.statSync(file.abs);\n } catch {\n // Unreadable now (race/permissions) — skip; it just won't be in the graph.\n continue;\n }\n if (limits.maxFileBytes > 0 && stat.size > limits.maxFileBytes) {\n // Too large to parse (almost always generated/minified). It stays in\n // fileStats — under a size-derived sentinel hash, so the file is never\n // read into memory — because the freshness probe re-discovers it; were\n // it absent from the snapshot every probe would report phantom \"added\"\n // drift and auto-refresh would rebuild in a loop.\n fileStats.push({\n rel: file.rel,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n hash: hashString(`vg:oversize:${stat.size}`),\n });\n buildWarnings.push(\n `${file.rel}: skipped — ${formatBytes(stat.size)} exceeds the ` +\n `${formatBytes(limits.maxFileBytes)} per-file limit (set VG_MAX_FILE_BYTES to raise it, 0 to disable)`,\n );\n continue;\n }\n let hash = '';\n try {\n hash = hashBytes(fs.readFileSync(file.abs));\n } catch {\n continue;\n }\n hashes.set(file.rel, hash);\n fileStats.push({ rel: file.rel, size: stat.size, mtimeMs: stat.mtimeMs, hash });\n const cached = cache.get(file.rel, hash);\n if (cached) reused.push(cached);\n else toParse.push(file);\n }\n\n const parsedNew = await parseFiles(toParse, {\n jobs: options.jobs,\n inline: options.inline,\n onProgress: options.onParseProgress,\n grammarsDir: options.grammarsDir,\n memoryBudgetMb: limits.memoryBudgetMb,\n });\n checkMemoryBudget('parse', limits.memoryBudgetMb);\n for (const p of parsedNew) cache.set(p.rel, p);\n\n // Persist the cache for the next incremental build.\n const currentRels = new Set(files.map((f) => f.rel));\n cache.prune(currentRels);\n cache.save();\n\n const parses = [...reused, ...parsedNew].sort((a, b) =>\n a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0,\n );\n\n const warnings = [...buildWarnings, ...parses.flatMap((p) => p.warnings ?? [])];\n\n // Resolve → nodes/edges. The module resolver follows relative imports plus\n // tsconfig path aliases and workspace-package names (so monorepo cross-package\n // imports resolve, not just relative ones).\n const moduleResolver = buildModuleResolver(root, new Set(parses.map((p) => p.rel)));\n const resolved = resolve(parses, moduleResolver);\n checkMemoryBudget('resolve', limits.memoryBudgetMb);\n\n // Precise resolution rungs sit above the heuristic floor and are authoritative\n // for the files they cover (their relational edges replace the heuristic ones,\n // not merely augment them). Order: heuristic → tsc → scip. Runs before\n // test-linkage so it sharpens those edges too.\n const nodeFileById = new Map(resolved.nodes.map((n) => [n.id, n.file]));\n let edges = resolved.edges;\n const resolvers: ResolverKind[] = [...resolved.stats.resolvers];\n // Files a precise rung (tsc/scip) covered — their heuristic unknowns are\n // superseded by the authoritative resolver and must not be reported as unknown.\n const preciseCoveredFiles = new Set<string>();\n\n // Rung 1 — TypeScript Compiler API for TS/JS (default-on, in-process, no\n // external tool). The type checker resolves member/`this`/imported/aliased\n // calls and heritage that the heuristic structurally cannot.\n let tscStats: BuildResult['tsc'];\n // `hashes` holds exactly the parsed corpus — oversized (size-capped) files\n // are excluded here too, so the TS program never loads them.\n let tsFiles = options.noTsc\n ? []\n : files\n .filter((f) => (f.lang.id === 'ts' || f.lang.id === 'tsx' || f.lang.id === 'js') && hashes.has(f.rel))\n .map((f) => ({ rel: f.rel, abs: f.abs }));\n if (limits.tscMaxFiles > 0 && tsFiles.length > limits.tscMaxFiles) {\n // A ts.Program over the whole corpus is the largest single memory consumer\n // in the build. Past the cap, fall back to the heuristic floor (still a\n // complete graph, just less precise call resolution).\n warnings.push(\n `typescript resolver skipped — ${tsFiles.length.toLocaleString()} TS/JS files exceed the ` +\n `${limits.tscMaxFiles.toLocaleString()}-file limit; calls use the heuristic resolver ` +\n `(set VG_TSC_MAX_FILES to raise it, 0 to disable)`,\n );\n tsFiles = [];\n }\n if (tsFiles.length) {\n const res = tsResolveEdges(root, tsFiles, resolved.nodes);\n if (res.stats.files > 0) {\n edges = mergePreciseEdges(edges, res.edges, res.coveredFiles, nodeFileById);\n for (const f of res.coveredFiles) preciseCoveredFiles.add(f);\n if (!resolvers.includes('tsc')) resolvers.unshift('tsc');\n tscStats = res.stats;\n }\n checkMemoryBudget('typescript resolution', limits.memoryBudgetMb);\n }\n\n // Rung 2 — a real SCIP index (if present), the most precise rung for any\n // language an indexer covers.\n const scip = options.noScip ? null : loadScipIndex(root, options.scip);\n let scipStats: BuildResult['scip'];\n if (scip) {\n const res = scipEdges(scip.index, resolved.nodes, toRepoRel);\n edges = mergePreciseEdges(edges, res.edges, res.coveredFiles, nodeFileById);\n for (const f of res.coveredFiles) preciseCoveredFiles.add(f);\n if (!resolvers.includes('scip')) resolvers.unshift('scip');\n scipStats = { ...res.stats, tool: scip.tool };\n }\n\n // Test-awareness: static test→code linkage, then runtime coverage if present.\n const linked = applyStaticTestLinkage(resolved.nodes, edges);\n let nodes = linked.nodes;\n const coverage = options.noCoverage ? null : loadCoverage(root, options.coverage);\n if (coverage) nodes = applyCoverage(nodes, coverage);\n\n // Analyse → centrality/areas/surprise (test/coverage edges excluded from these).\n const analysis = analyze(nodes, linked.edges, { cluster: options.cluster });\n checkMemoryBudget('analysis', limits.memoryBudgetMb);\n\n const languages = [...new Set(parses.map((p) => p.lang))].sort();\n const edgeKinds = [...new Set(analysis.edges.map((e) => e.kind))].sort() as EdgeKind[];\n const corpusHash = computeCorpusHash(parses, hashes);\n\n // Edge-level epistemic tier: stamp every edge with how it was resolved\n // (observed / name-matched / declared) so consumers can filter by assurance.\n // Pure function of the edge's fields + its destination node kind → deterministic.\n const nodeKindById = new Map(analysis.nodes.map((n) => [n.id, n.kind]));\n for (const e of analysis.edges) {\n e.epistemic = classifyEpistemic(e, nodeKindById.get(e.dst));\n }\n\n const toolchain = computeToolchain(grammars, resolvers);\n\n const generatedAt = options.generatedAt ?? new Date().toISOString();\n const testsCount = linked.testFiles.length;\n const untestedCount = analysis.nodes.filter(\n (n) => (n.kind === 'function' || n.kind === 'method') && n.tested === false,\n ).length;\n\n const graph: VgGraph = {\n schemaVersion: SCHEMA_VERSION,\n generatedAt,\n provenance: {\n tool: 'vg',\n version: VERSION,\n grammars: Object.fromEntries(languages.map((l) => [l, grammars])),\n resolver: resolvers,\n deep: options.deep ?? false,\n corpusHash,\n toolchain,\n },\n meta: {\n root: path.basename(root) === '' ? '.' : '.',\n languages,\n counts: {\n nodes: analysis.nodes.length,\n edges: analysis.edges.length,\n areas: analysis.areas.length,\n tests: testsCount,\n untested: untestedCount,\n },\n cluster: analysis.cluster,\n edgeKinds,\n },\n nodes: analysis.nodes,\n edges: analysis.edges,\n areas: analysis.areas,\n };\n\n // Unknowns: heuristic references we could not resolve, minus any site a precise\n // rung authoritatively covered. Ranked/consumed by `vg unknowns`. Deterministic\n // (already sorted by resolve()); only ids that survived analysis are kept.\n const survivingIds = new Set(analysis.nodes.map((n) => n.id));\n const unknowns = resolved.unresolved\n .filter((u) => !preciseCoveredFiles.has(u.fromRel) && survivingIds.has(u.from))\n .map((u) => ({ from: u.from, name: u.name, kind: u.kind, count: u.count }));\n if (unknowns.length) graph.unknowns = unknowns;\n\n // Facts (--deep) and grounding (default on).\n if (options.deep) {\n const facts = buildFacts(parses, analysis.nodes, analysis.edges);\n if (facts.length) graph.facts = facts;\n }\n if (!options.noGround) {\n const grounding = groundGraph(analysis.nodes, analysis.edges, parses);\n if (grounding.length) graph.grounding = grounding;\n }\n\n return {\n graph,\n timing: { totalMs: Math.round((nowMs() - start) * 1000) / 1000 },\n reparsed: parsedNew.length,\n reused: reused.length,\n totalFiles: files.length,\n fileStats,\n resolveStats: resolved.stats,\n tsc: tscStats,\n scip: scipStats,\n warnings,\n };\n}\n\n/** Repo-relative POSIX path for a SCIP document path. */\nfunction toRepoRel(p: string): string {\n return p.split('\\\\').join('/').replace(/^\\.?\\//, '');\n}\n\n/** Auto-detect (or take an explicit) SCIP index and decode it. */\nfunction loadScipIndex(root: string, explicit?: string): { index: ScipIndex; tool?: string } | null {\n const candidates = [\n explicit,\n path.join(root, 'index.scip'),\n path.join(root, '.vibgrate', 'index.scip'),\n ].filter((p): p is string => Boolean(p));\n for (const file of candidates) {\n const abs = path.isAbsolute(file) ? file : path.resolve(root, file);\n if (!fs.existsSync(abs)) continue;\n try {\n const index = decodeScipIndex(new Uint8Array(fs.readFileSync(abs)));\n if (index.documents.length) {\n return { index, tool: index.toolVersion ? `${index.toolName} ${index.toolVersion}` : index.toolName };\n }\n } catch {\n /* unreadable/garbled index — fall back to heuristic */\n }\n }\n return null;\n}\n\n/** Relational edge kinds a precise resolver is authoritative for. Structural\n * kinds (import/contains/test/coverage) are produced elsewhere and preserved. */\nconst PRECISE_KINDS = new Set<EdgeKind>(['call', 'references', 'extends', 'implements']);\n\n/**\n * Merge precise edges over the base set, treating the precise rung as\n * authoritative for the files it covered. For a covered file we DROP the\n * heuristic relational edges originating there (they are guesses the precise\n * resolver has now superseded) and replace them with the precise ones. Edges\n * whose source lives in an uncovered file, and non-relational edges, are kept.\n * Already-precise edges (tsc/scip) are never dropped. Precise wins on id\n * collision. Output is stably sorted for determinism.\n */\nfunction mergePreciseEdges(\n base: GraphEdge[],\n precise: GraphEdge[],\n coveredFiles: Set<string>,\n nodeFileById: Map<string, string>,\n): GraphEdge[] {\n const byId = new Map<string, GraphEdge>();\n for (const e of base) {\n if (PRECISE_KINDS.has(e.kind) && e.resolution === 'heuristic') {\n const srcFile = nodeFileById.get(e.src);\n if (srcFile && coveredFiles.has(srcFile)) continue; // superseded by precise rung\n }\n byId.set(e.id, e);\n }\n for (const e of precise) byId.set(e.id, e); // precise wins on id collision\n return [...byId.values()].sort(\n (a, b) =>\n a.kind.localeCompare(b.kind) || a.src.localeCompare(b.src) || a.dst.localeCompare(b.dst),\n );\n}\n\n/**\n * The reproducibility fingerprint: a short content-address over the parts of the\n * toolchain that deterministically shape graph *content* — schema, tool version,\n * tree-sitter grammar set, and the resolver kinds available. Node/OS versions are\n * deliberately excluded so the graph stays byte-stable across host runtimes; the\n * fingerprint pins the parse/resolve toolchain, which is what actually changes\n * edges between a CI run and a laptop run. This is the value `vg attest` signs and\n * `vg verify` compares against a committed graph.\n */\nfunction computeToolchain(grammars: string, resolvers: ResolverKind[]): Toolchain {\n const sortedResolvers = [...new Set(resolvers)].sort();\n return {\n schema: SCHEMA_VERSION,\n tool: VERSION,\n grammars,\n resolvers: sortedResolvers,\n fingerprint: shortId(\n canonicalize({\n schema: SCHEMA_VERSION,\n tool: VERSION,\n grammars,\n resolvers: sortedResolvers,\n }),\n ),\n };\n}\n\n/** blake3 over the sorted (path, content-hash) list — the corpus identity. */\nfunction computeCorpusHash(parses: FileParse[], hashes: Map<string, string>): string {\n const list = parses\n .map((p) => [p.rel, hashes.get(p.rel) ?? p.hash] as const)\n .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n return hashString(canonicalize(list));\n}\n\nfunction nowMs(): number {\n return Number(process.hrtime.bigint() / 1000n) / 1000;\n}\n","import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic Markdown summary (`GRAPH_REPORT.md`). Given a pinned\n * `generatedAt`, the report is byte-stable. Numbers are derived purely from the\n * graph, so the report can be regenerated from a committed `graph.json`.\n */\nexport function renderReport(graph: VgGraph): string {\n const { meta, provenance, nodes, edges } = graph;\n const lines: string[] = [];\n\n lines.push('# Code Graph Report');\n lines.push('');\n lines.push(`Generated by \\`vg\\` ${provenance.version} · schema \\`${graph.schemaVersion}\\``);\n lines.push('');\n lines.push('## Summary');\n lines.push('');\n lines.push(`- **Nodes:** ${meta.counts.nodes.toLocaleString('en-US')}`);\n lines.push(`- **Edges:** ${meta.counts.edges.toLocaleString('en-US')}`);\n lines.push(`- **Areas:** ${meta.counts.areas.toLocaleString('en-US')}`);\n lines.push(`- **Languages:** ${meta.languages.join(', ') || '—'}`);\n lines.push(`- **Clustering:** ${meta.cluster}`);\n lines.push(`- **Resolvers:** ${provenance.resolver.join(', ')}`);\n lines.push(`- **Edge kinds:** ${meta.edgeKinds.join(', ') || '—'}`);\n lines.push('');\n\n // Files by definition count.\n const fileNodes = nodes.filter((n) => n.kind === 'file');\n const defsByFile = new Map<string, number>();\n for (const n of nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n defsByFile.set(n.file, (defsByFile.get(n.file) ?? 0) + 1);\n }\n const topFiles = [...defsByFile.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 15);\n if (topFiles.length) {\n lines.push('## Largest files (by definitions)');\n lines.push('');\n lines.push('| File | Definitions |');\n lines.push('| --- | ---: |');\n for (const [file, count] of topFiles) lines.push(`| \\`${file}\\` | ${count} |`);\n lines.push('');\n }\n\n // Most-connected nodes (Phase 0 importance = normalised degree).\n const topNodes = nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 15);\n if (topNodes.length) {\n lines.push('## Most-connected definitions');\n lines.push('');\n lines.push('| Symbol | Kind | File | Importance |');\n lines.push('| --- | --- | --- | ---: |');\n for (const n of topNodes) {\n lines.push(\n `| \\`${n.qualifiedName}\\` | ${n.kind} | \\`${n.file}\\`:${n.span.start} | ${n.importance.toFixed(3)} |`,\n );\n }\n lines.push('');\n }\n\n // Edge-kind breakdown.\n const byKind = new Map<string, number>();\n for (const e of edges) byKind.set(e.kind, (byKind.get(e.kind) ?? 0) + 1);\n if (byKind.size) {\n lines.push('## Edges by kind');\n lines.push('');\n lines.push('| Kind | Count |');\n lines.push('| --- | ---: |');\n for (const [kind, count] of [...byKind.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(`| ${kind} | ${count} |`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push(`_Files: ${fileNodes.length} · Corpus: \\`${provenance.corpusHash.slice(0, 16)}…\\`_`);\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { stableStringify } from './serialize.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Phase-0 `graph.html`: a self-contained, dependency-free, deterministic\n * overview (summary + most-connected definitions + per-file breakdown), with the\n * full graph embedded as JSON for tooling. The interactive WebGL view (sigma.js\n * over a ForceAtlas2 layout, scaling past ~5k nodes — VG-ENGINE-TEARDOWN §3.12)\n * lands in Phase 1; this keeps the artifact present, honest, and byte-stable now.\n */\nexport function renderHtml(graph: VgGraph): string {\n const top = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 50);\n\n const rows = top\n .map(\n (n) =>\n `<tr><td><code>${esc(n.qualifiedName)}</code></td><td>${esc(n.kind)}</td>` +\n `<td><code>${esc(n.file)}</code>:${n.span.start}</td><td>${n.importance.toFixed(3)}</td></tr>`,\n )\n .join('\\n');\n\n const embedded = stableStringify(graph, 0);\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>vg · code graph</title>\n<style>\n :root { color-scheme: light dark; }\n body { font: 14px/1.5 system-ui, sans-serif; margin: 2rem auto; max-width: 60rem; padding: 0 1rem; }\n h1 { font-size: 1.4rem; } h2 { font-size: 1.1rem; margin-top: 2rem; }\n table { border-collapse: collapse; width: 100%; }\n th, td { text-align: left; padding: 4px 8px; border-bottom: 1px solid #8884; }\n td:last-child, th:last-child { text-align: right; }\n .meta { color: #888; } code { font-size: 0.9em; }\n</style>\n</head>\n<body>\n<h1>vg · code graph</h1>\n<p class=\"meta\">${graph.meta.counts.nodes} nodes · ${graph.meta.counts.edges} edges ·\n${graph.meta.counts.areas} areas · ${esc(graph.meta.languages.join(', ') || '—')} ·\nclustering: ${esc(graph.meta.cluster)} · vg ${esc(graph.provenance.version)}</p>\n<h2>Most-connected definitions</h2>\n<table>\n<thead><tr><th>Symbol</th><th>Kind</th><th>Location</th><th>Importance</th></tr></thead>\n<tbody>\n${rows}\n</tbody>\n</table>\n<p class=\"meta\">Interactive WebGL view arrives in Phase 1. The full graph is embedded below for tooling.</p>\n<script type=\"application/json\" id=\"vg-graph\">\n${embedded}\n</script>\n</body>\n</html>\n`;\n}\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { serializeGraph } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Write the build artifacts under `.vibgrate/`. `graph.json` is the committable\n * map; `GRAPH_REPORT.md` and `graph.html` are convenience artifacts (volatile —\n * gitignored by default via `vg share`).\n */\n\nexport interface WriteOptions {\n root: string;\n html?: boolean; // default true\n report?: boolean; // default true\n graphPath?: string; // override graph.json path\n}\n\nexport interface WrittenArtifacts {\n graphPath: string;\n reportPath?: string;\n htmlPath?: string;\n factsPath?: string;\n}\n\nexport function vibgrateDir(root: string): string {\n return path.join(root, '.vibgrate');\n}\n\n/**\n * By default the graph artifacts are *local*: builds and auto-refreshes rewrite\n * them constantly, and without an ignore file every `vg ask`/`vg serve` leaves\n * the branch dirty (untracked or modified `.vibgrate/` files) — irritating for\n * humans and a source of junk commits from AI agents. So the first time vg\n * writes into `.vibgrate/` it also drops a `.gitignore` covering the graph\n * artifacts, the cache, and itself.\n *\n * Deliberately create-once: an existing `.vibgrate/.gitignore` is NEVER\n * touched, whatever its content — `vg share` owns it after opt-in (rewritten to\n * commit `graph.json`), and a user-managed file (even an empty one) is theirs.\n * Scanner artifacts meant for git (`baseline.json`, `standards.json`,\n * `attestation.intoto.jsonl`) are intentionally not listed.\n */\nconst DEFAULT_GITIGNORE = [\n '# Created once by vg — local graph artifacts stay out of git by default.',\n '# Run `vg share` to commit the map for your team (it rewrites this file).',\n '# vg never touches an existing .vibgrate/.gitignore: edit it (or leave it',\n '# empty) to manage these ignores yourself.',\n '.gitignore',\n 'cache/',\n 'graph.json',\n 'graph.html',\n 'GRAPH_REPORT.md',\n 'facts.jsonl',\n 'mcp-navigation.json',\n];\n\nexport function ensureVibgrateGitignore(root: string): void {\n const file = path.join(vibgrateDir(root), '.gitignore');\n if (fs.existsSync(file)) return;\n fs.mkdirSync(vibgrateDir(root), { recursive: true });\n fs.writeFileSync(file, `${DEFAULT_GITIGNORE.join('\\n')}\\n`);\n}\n\nexport function defaultGraphPath(root: string): string {\n return path.join(vibgrateDir(root), 'graph.json');\n}\n\nexport function writeArtifacts(graph: VgGraph, options: WriteOptions): WrittenArtifacts {\n const dir = vibgrateDir(options.root);\n fs.mkdirSync(dir, { recursive: true });\n ensureVibgrateGitignore(options.root);\n\n const graphPath = options.graphPath ?? defaultGraphPath(options.root);\n fs.mkdirSync(path.dirname(graphPath), { recursive: true });\n // Atomic write (temp + rename): `vg serve` hot-reloads graph.json on mtime\n // change, so a rebuild — including its own in-process auto-refresh — must\n // never expose a half-written file to a concurrent reader.\n const tmp = `${graphPath}.${process.pid}.tmp`;\n try {\n fs.writeFileSync(tmp, serializeGraph(graph));\n fs.renameSync(tmp, graphPath);\n } catch (err) {\n fs.rmSync(tmp, { force: true });\n throw err;\n }\n\n const written: WrittenArtifacts = { graphPath };\n\n if (options.report !== false) {\n const reportPath = path.join(dir, 'GRAPH_REPORT.md');\n fs.writeFileSync(reportPath, renderReport(graph));\n written.reportPath = reportPath;\n }\n\n if (options.html !== false) {\n const htmlPath = path.join(dir, 'graph.html');\n fs.writeFileSync(htmlPath, renderHtml(graph));\n written.htmlPath = htmlPath;\n }\n\n // facts.jsonl (deterministic NDJSON) when facts were derived (--deep).\n if (graph.facts && graph.facts.length) {\n const factsPath = path.join(dir, 'facts.jsonl');\n fs.writeFileSync(factsPath, graph.facts.map((f) => JSON.stringify(f)).join('\\n') + '\\n');\n written.factsPath = factsPath;\n }\n\n return written;\n}\n","import * as fs from 'node:fs';\nimport { defaultGraphPath } from './artifacts.js';\nimport { parseGraph } from './serialize.js';\nimport type { VgGraph } from '../schema.js';\n\n/** Load a committed `graph.json`. Returns null if none exists at the path. */\nexport function loadGraph(root: string, graphPath?: string): VgGraph | null {\n const file = graphPath ?? defaultGraphPath(root);\n if (!fs.existsSync(file)) return null;\n return parseGraph(fs.readFileSync(file, 'utf8'));\n}\n","import { buildGraph } from './build.js';\nimport { serializeGraph } from './serialize.js';\nimport { loadGraph } from './load.js';\nimport { hashString } from './hash.js';\n\n/**\n * Determinism self-check (`vg verify`, exit 4 on failure).\n *\n * Proves the load-bearing guarantees:\n * 1. Run-to-run determinism — two full rebuilds are byte-identical.\n * 2. Cache safety — an incremental (cache-warm) build equals a full rebuild.\n * 3. Toolchain reproducibility — the toolchain that would build the graph here\n * matches the one recorded in the committed `graph.json` (when present), so a\n * CI run and a laptop run on different grammar/resolver versions are caught\n * instead of silently producing a different graph.\n *\n * `generatedAt` is pinned to a constant for the comparison so the only legitimate\n * source of variation is removed and any real nondeterminism surfaces.\n */\n\nconst PINNED = '1970-01-01T00:00:00.000Z';\n\nexport interface VerifyResult {\n ok: boolean;\n checks: { name: string; ok: boolean; detail?: string }[];\n digest: string;\n}\n\nexport async function verifyDeterminism(opts: {\n root: string;\n only?: string[];\n exclude?: string[];\n jobs?: number;\n}): Promise<VerifyResult> {\n const base = { root: opts.root, only: opts.only, exclude: opts.exclude, generatedAt: PINNED };\n\n const buildA = await buildGraph({ ...base, noCache: true, jobs: opts.jobs });\n const a = serializeGraph(buildA.graph);\n const b = serializeGraph((await buildGraph({ ...base, noCache: true, jobs: 1 })).graph);\n const cached = serializeGraph((await buildGraph({ ...base, noCache: false })).graph);\n\n const checks = [\n { name: 'run-to-run determinism', ok: a === b, detail: diffHint(a, b) },\n { name: 'cache safety (incremental == full)', ok: a === cached, detail: diffHint(a, cached) },\n ];\n\n // Toolchain reproducibility: if a graph.json is committed, the toolchain that\n // would build it here must match the one it was built with. A mismatch is the\n // CI-vs-laptop divergence surfacing loudly instead of as a silent content diff.\n // Skip under --only/--exclude: a scoped rebuild's resolver set (e.g. no tsc for\n // a non-TS subtree) legitimately differs from the full-repo committed graph, so\n // comparing the two would be a false failure.\n const scoped = Boolean(opts.only?.length || opts.exclude?.length);\n const committed = scoped ? null : loadGraph(opts.root);\n const committedFp = committed?.provenance.toolchain?.fingerprint;\n const currentFp = buildA.graph.provenance.toolchain?.fingerprint;\n if (committedFp && currentFp) {\n const ok = committedFp === currentFp;\n checks.push({\n name: 'toolchain fingerprint matches committed graph',\n ok,\n detail: ok\n ? undefined\n : `committed toolchain ${committedFp} != current ${currentFp} ` +\n `(grammar/resolver versions differ — rebuild or align the toolchain)`,\n });\n }\n\n return {\n ok: checks.every((c) => c.ok),\n checks,\n digest: hashString(a),\n };\n}\n\nfunction diffHint(x: string, y: string): string | undefined {\n if (x === y) return undefined;\n // Find the first differing line for an actionable message (no internals leak).\n const xl = x.split('\\n');\n const yl = y.split('\\n');\n const n = Math.max(xl.length, yl.length);\n for (let i = 0; i < n; i++) {\n if (xl[i] !== yl[i]) {\n return `first divergence at line ${i + 1}`;\n }\n }\n return 'outputs differ in length';\n}\n","/**\n * Exit codes (VG-CLI-SPEC §1.2). CI and agents branch on these, so they are a\n * stable contract.\n */\nexport const ExitCode = {\n OK: 0,\n ERROR: 1,\n GATE_FAILED: 2,\n NOT_FOUND: 3,\n NON_DETERMINISTIC: 4,\n USAGE_ERROR: 5,\n} as const;\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode];\n\n/** An error carrying an explicit exit code and an actionable, internals-free message. */\nexport class CliError extends Error {\n readonly code: ExitCodeValue;\n constructor(message: string, code: ExitCodeValue = ExitCode.ERROR) {\n super(message);\n this.name = 'CliError';\n this.code = code;\n }\n}\n\nexport function notFound(message: string): CliError {\n return new CliError(message, ExitCode.NOT_FOUND);\n}\n\nexport function usageError(message: string): CliError {\n return new CliError(message, ExitCode.USAGE_ERROR);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { discover } from './discover.js';\nimport { hashBytes } from './hash.js';\nimport { cacheDir } from './cache.js';\nimport { stableStringify } from './serialize.js';\nimport type { FileStat } from './build.js';\n\n/**\n * Freshness tracking for the code map (VG auto-refresh).\n *\n * Every build writes a *snapshot* — the stat (size, mtime) and content hash of\n * each corpus file, plus the build scope — under `.vibgrate/cache/` (gitignored,\n * machine-local, never part of the committed artifact). A *probe* then answers\n * \"did the working tree drift from the map?\" with a stat-only walk: no file is\n * read unless its size/mtime moved, and a moved stat is confirmed by re-hashing\n * just that file. Touch-only changes (git checkout, `touch`, editor re-saves\n * with identical content) are *absorbed*: the snapshot's stats are updated in\n * place so they never trigger a rebuild — not now, not on the next probe.\n *\n * This is what lets `vg serve` and `vg ask` stay fresh without a filesystem\n * watcher: freshness only matters at the moment of a query, so we check on\n * read, cheaply, and rebuild incrementally only when content really changed.\n */\n\nconst SNAPSHOT_VERSION = 'vg-freshness/1';\n\n/** The graph-affecting discovery/build scope, replayed verbatim on refresh. */\nexport interface BuildScope {\n only?: string[];\n exclude?: string[];\n paths?: string[];\n deep?: boolean;\n noGround?: boolean;\n scip?: string;\n noScip?: boolean;\n noTsc?: boolean;\n cluster?: string;\n grammarsDir?: string;\n}\n\ninterface SnapshotFile {\n version: string;\n /** corpusHash of the build this snapshot belongs to. */\n corpusHash: string;\n scope: BuildScope;\n files: Record<string, { size: number; mtimeMs: number; hash: string }>;\n}\n\nexport interface Drift {\n /** Files whose *content* changed (stat moved AND hash differs). */\n changed: string[];\n /** Files present now but absent from the snapshot. */\n added: string[];\n /** Snapshot files no longer present. */\n removed: string[];\n}\n\nexport interface ProbeResult {\n drift: Drift;\n /** The recorded build scope — what a refresh must replay. */\n scope: BuildScope;\n /** corpusHash the current map was built from. */\n corpusHash: string;\n}\n\nexport function snapshotPath(root: string): string {\n return path.join(cacheDir(root), 'freshness.json');\n}\n\n/** Persist the snapshot after a successful build. Best-effort (cache-only). */\nexport function writeSnapshot(\n root: string,\n corpusHash: string,\n fileStats: FileStat[],\n scope: BuildScope = {},\n): void {\n const files: SnapshotFile['files'] = {};\n for (const f of fileStats) files[f.rel] = { size: f.size, mtimeMs: f.mtimeMs, hash: f.hash };\n const snapshot: SnapshotFile = { version: SNAPSHOT_VERSION, corpusHash, scope: pruneScope(scope), files };\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(snapshotPath(root), stableStringify(snapshot, 0));\n } catch {\n /* read-only checkout etc. — freshness just stays unavailable */\n }\n}\n\nexport function loadSnapshot(root: string): SnapshotFile | null {\n try {\n const loaded = JSON.parse(fs.readFileSync(snapshotPath(root), 'utf8')) as SnapshotFile;\n if (loaded.version === SNAPSHOT_VERSION && loaded.files && typeof loaded.corpusHash === 'string') {\n return { ...loaded, scope: loaded.scope ?? {} };\n }\n } catch {\n /* missing/corrupt → no snapshot */\n }\n return null;\n}\n\nexport function hasDrift(drift: Drift): boolean {\n return drift.changed.length + drift.added.length + drift.removed.length > 0;\n}\n\n/** Total drifted files — the number shown to humans. */\nexport function driftCount(drift: Drift): number {\n return drift.changed.length + drift.added.length + drift.removed.length;\n}\n\n/**\n * Compare the working tree to the snapshot. Returns null when no snapshot\n * exists (nothing was ever built on this machine — auto-refresh stays off\n * rather than guessing the build scope). Stat-only except for files whose\n * stat moved; touch-only moves are absorbed back into the snapshot.\n */\nexport function probeFreshness(root: string): ProbeResult | null {\n const snapshot = loadSnapshot(root);\n if (!snapshot) return null;\n\n const { scope } = snapshot;\n let discovered;\n try {\n discovered = discover({ root, only: scope.only, exclude: scope.exclude, paths: scope.paths });\n } catch {\n return null; // root vanished / unreadable — treat as unknown, not stale\n }\n\n const drift: Drift = { changed: [], added: [], removed: [] };\n const seen = new Set<string>();\n let absorbed = false;\n\n for (const file of discovered) {\n seen.add(file.rel);\n const entry = snapshot.files[file.rel];\n if (!entry) {\n drift.added.push(file.rel);\n continue;\n }\n let stat: fs.Stats;\n try {\n stat = fs.statSync(file.abs);\n } catch {\n drift.removed.push(file.rel); // raced away between walk and stat\n continue;\n }\n if (stat.size === entry.size && stat.mtimeMs === entry.mtimeMs) continue;\n // Stat moved — confirm with content before declaring drift.\n let hash = '';\n try {\n hash = hashBytes(fs.readFileSync(file.abs));\n } catch {\n drift.removed.push(file.rel);\n continue;\n }\n if (hash === entry.hash) {\n // Touch-only (checkout/`touch`/identical re-save): absorb the new stat\n // so this file never re-triggers a probe, without any rebuild.\n snapshot.files[file.rel] = { size: stat.size, mtimeMs: stat.mtimeMs, hash };\n absorbed = true;\n } else {\n drift.changed.push(file.rel);\n }\n }\n\n for (const rel of Object.keys(snapshot.files)) {\n if (!seen.has(rel)) drift.removed.push(rel);\n }\n\n // Persist absorptions only when the tree is otherwise clean — a real drift\n // triggers a rebuild that rewrites the snapshot wholesale anyway.\n if (absorbed && !hasDrift(drift)) {\n try {\n fs.writeFileSync(snapshotPath(root), stableStringify(snapshot, 0));\n } catch {\n /* best-effort */\n }\n }\n\n drift.changed.sort();\n drift.added.sort();\n drift.removed.sort();\n return { drift, scope, corpusHash: snapshot.corpusHash };\n}\n\n/** Drop empty/undefined scope fields so the snapshot stays minimal and stable. */\nfunction pruneScope(scope: BuildScope): BuildScope {\n const out: BuildScope = {};\n if (scope.only?.length) out.only = [...scope.only].sort();\n if (scope.exclude?.length) out.exclude = [...scope.exclude];\n if (scope.paths?.length) out.paths = [...scope.paths];\n if (scope.deep) out.deep = true;\n if (scope.noGround) out.noGround = true;\n if (scope.scip) out.scip = scope.scip;\n if (scope.noScip) out.noScip = true;\n if (scope.noTsc) out.noTsc = true;\n if (scope.cluster) out.cluster = scope.cluster;\n if (scope.grammarsDir) out.grammarsDir = scope.grammarsDir;\n return out;\n}\n","import Graph from 'graphology';\nimport type { GraphEdge, GraphNode } from '../schema.js';\n\n/**\n * Build the in-memory graphology multigraph from the schema nodes/edges. This is\n * the model the analysis (centrality, clustering), query, and path commands run\n * over. A directed multigraph: multiple typed edges may connect the same pair\n * (e.g. a `call` and an `import`), each keyed by its content id.\n */\nexport function buildGraphologyGraph(nodes: GraphNode[], edges: GraphEdge[]): Graph {\n const g = new Graph({ type: 'directed', multi: true, allowSelfLoops: true });\n for (const n of nodes) {\n g.addNode(n.id, { kind: n.kind, name: n.name });\n }\n for (const e of edges) {\n // Edges can reference nodes that exist; src/dst always come from node ids we\n // created, so both endpoints are present. Guard anyway for robustness.\n if (!g.hasNode(e.src) || !g.hasNode(e.dst)) continue;\n if (g.hasEdge(e.id)) continue;\n g.addDirectedEdgeWithKey(e.id, e.src, e.dst, { kind: e.kind, weight: e.confidence });\n }\n return g;\n}\n","import { bidirectional } from 'graphology-shortest-path/unweighted.js';\nimport { buildGraphologyGraph } from './graph-model.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Shortest connection between two nodes (`vg path`). Uses graphology's\n * bidirectional BFS over the directed graph; falls back to the reverse direction\n * so \"how does A connect to B\" still answers when the dependency arrow runs B→A.\n */\nexport interface PathResult {\n ids: string[];\n direction: 'forward' | 'reverse';\n}\n\nexport function shortestPath(graph: VgGraph, srcId: string, dstId: string): PathResult | null {\n const g = buildGraphologyGraph(graph.nodes, graph.edges);\n if (!g.hasNode(srcId) || !g.hasNode(dstId)) return null;\n const forward = bidirectional(g, srcId, dstId);\n if (forward) return { ids: forward, direction: 'forward' };\n const reverse = bidirectional(g, dstId, srcId);\n if (reverse) return { ids: reverse.slice().reverse(), direction: 'reverse' };\n return null;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { GraphIndex, indexFor } from './relations.js';\nimport { impactOf } from './impact.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Answering the wedge questions: \"which tests cover X\" (`vg tests`) and \"which\n * tests must I run if I change X\" (`vg impact --tests`). Deterministic, from the\n * `test` edges + coverage produced at build time.\n */\n\nexport interface CoveringTest {\n file: string; // test file (relative)\n basis: 'call' | 'coverage';\n confidence: number;\n}\n\nexport function coveringTests(graph: VgGraph, node: GraphNode, index?: GraphIndex): CoveringTest[] {\n const idx = index ?? indexFor(graph);\n const byId = idx.nodeById;\n const out = new Map<string, CoveringTest>();\n for (const e of idx.in(node.id, 'test')) {\n const testNode = byId.get(e.src);\n if (!testNode) continue;\n out.set(testNode.file, { file: testNode.file, basis: 'call', confidence: e.confidence });\n }\n // Runtime coverage is a signal even without a specific test attribution.\n if (typeof node.coverage === 'number' && node.coverage > 0 && out.size === 0) {\n out.set('(coverage)', { file: '(coverage report)', basis: 'coverage', confidence: node.coverage });\n }\n return [...out.values()].sort((a, b) => b.confidence - a.confidence || a.file.localeCompare(b.file));\n}\n\nexport interface TestImpact {\n affectedTestFiles: string[];\n untestedAffected: { id: string; name: string; file: string }[];\n}\n\n/** The test files that exercise any node in the impact set of `rootId`. */\nexport function testsToRun(graph: VgGraph, rootId: string, depth = 4): TestImpact {\n const idx = indexFor(graph);\n const impact = impactOf(graph, rootId, { depth });\n const affectedIds = new Set<string>([rootId, ...impact.affected.map((a) => a.id)]);\n\n const testFiles = new Set<string>();\n const untested: { id: string; name: string; file: string }[] = [];\n for (const id of affectedIds) {\n const node = idx.node(id);\n if (!node) continue;\n const covers = coveringTests(graph, node, idx).filter((c) => c.basis === 'call');\n for (const c of covers) testFiles.add(c.file);\n if ((node.kind === 'function' || node.kind === 'method') && node.tested === false) {\n untested.push({ id: node.id, name: node.qualifiedName, file: node.file });\n }\n }\n return {\n affectedTestFiles: [...testFiles].sort(),\n untestedAffected: untested.sort((a, b) => a.name.localeCompare(b.name)),\n };\n}\n\n// --- runner detection ---\n\nexport interface Runner {\n name: string;\n command: (testFiles: string[]) => string;\n}\n\nexport function detectRunner(root: string, lang?: string): Runner {\n const pkgPath = path.join(root, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as { devDependencies?: Record<string, string>; dependencies?: Record<string, string> };\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.vitest) return { name: 'vitest', command: (f) => `npx vitest run ${f.join(' ')}`.trim() };\n if (deps.jest) return { name: 'jest', command: (f) => `npx jest ${f.join(' ')}`.trim() };\n if (deps.mocha) return { name: 'mocha', command: (f) => `npx mocha ${f.join(' ')}`.trim() };\n } catch {\n /* fall through */\n }\n }\n if (lang === 'py' || fs.existsSync(path.join(root, 'pyproject.toml')) || fs.existsSync(path.join(root, 'pytest.ini'))) {\n return { name: 'pytest', command: (f) => `pytest ${f.join(' ')}`.trim() };\n }\n if (lang === 'go' || fs.existsSync(path.join(root, 'go.mod'))) {\n return { name: 'go test', command: () => 'go test ./...' };\n }\n if (lang === 'cs' || hasFile(root, /\\.csproj$/) || hasFile(root, /\\.sln$/)) {\n return { name: 'dotnet test', command: () => 'dotnet test' };\n }\n if (lang === 'rb') return { name: 'rspec', command: (f) => `bundle exec rspec ${f.join(' ')}`.trim() };\n return { name: 'tests', command: (f) => (f.length ? f.join(' ') : '(no runner detected)') };\n}\n\nfunction hasFile(root: string, re: RegExp): boolean {\n try {\n return fs.readdirSync(root).some((f) => re.test(f));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Local-model discovery (VG-LOCAL-MODELS §9.2) — be a no-key *consumer* of the\n * developer's local model fleet. Fully offline and deterministic: inspect the\n * on-disk layouts of Ollama / LM Studio / llama.cpp, never the network. No\n * runtime is built or launched.\n */\n\nexport interface LocalModel {\n runtime: 'ollama' | 'lm-studio' | 'gguf';\n name: string;\n path: string;\n}\n\nexport function discoverModels(home = os.homedir()): LocalModel[] {\n return [...ollama(home), ...lmStudio(home), ...looseGguf(home)].sort(\n (a, b) => a.runtime.localeCompare(b.runtime) || a.name.localeCompare(b.name),\n );\n}\n\nfunction ollama(home: string): LocalModel[] {\n const base = path.join(home, '.ollama', 'models', 'manifests');\n const out: LocalModel[] = [];\n walk(base, 4, (file) => {\n // .../library/<model>/<tag>\n const rel = path.relative(base, file).split(path.sep);\n if (rel.length >= 2) {\n const tag = rel[rel.length - 1];\n const model = rel[rel.length - 2];\n out.push({ runtime: 'ollama', name: `${model}:${tag}`, path: file });\n }\n });\n return dedupe(out);\n}\n\nfunction lmStudio(home: string): LocalModel[] {\n const bases = [path.join(home, '.lmstudio', 'models'), path.join(home, '.cache', 'lm-studio', 'models')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 5, (file) => {\n if (!file.endsWith('.gguf')) return;\n const rel = path.relative(base, file).replace(/\\\\/g, '/');\n out.push({ runtime: 'lm-studio', name: rel, path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction looseGguf(home: string): LocalModel[] {\n const bases = [path.join(home, 'models'), path.join(home, '.cache', 'huggingface')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 4, (file) => {\n if (!file.endsWith('.gguf')) return;\n out.push({ runtime: 'gguf', name: path.basename(file), path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction walk(dir: string, depth: number, onFile: (file: string) => void): void {\n if (depth < 0) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) walk(abs, depth - 1, onFile);\n else if (e.isFile()) onFile(abs);\n }\n}\n\nfunction dedupe(models: LocalModel[]): LocalModel[] {\n const seen = new Set<string>();\n const out: LocalModel[] = [];\n for (const m of models) {\n const key = `${m.runtime}:${m.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(m);\n }\n return out;\n}\n","/**\n * Keep credential files out of version control automatically.\n *\n * `login` stores a DSN (a credential) and `dsn create --write` writes one to a\n * file. GUARDRAILS §1.1 (\"secrets are git-ignored and never committed\") makes\n * keeping those files out of git a hard requirement — so rather than relying on\n * the user to remember, the CLI adds the file to the project `.gitignore` for\n * them. This module locates the git work tree and appends the entry idempotently,\n * creating `.gitignore` when the repo doesn't have one yet.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Walk up from `startDir` to the git work-tree root — the nearest ancestor that\n * contains a `.git` entry (a directory for a normal clone, a file for a worktree\n * or submodule). Returns `null` when there is no git repo above `startDir`.\n */\nexport function findGitRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n // Walk up until we hit a `.git`, or run out of parents.\n for (;;) {\n if (fs.existsSync(path.join(dir, '.git'))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport type GitignoreStatus = 'added' | 'created' | 'present' | 'not-a-repo';\n\nexport interface GitignoreResult {\n /**\n * - `created` — `.gitignore` did not exist and was created with the entry.\n * - `added` — the entry was appended to an existing `.gitignore`.\n * - `present` — the entry was already there; nothing was written.\n * - `not-a-repo` — `startDir` is not inside a git work tree; nothing was done.\n */\n status: GitignoreStatus;\n entry: string;\n /** The `.gitignore` that was (or would have been) touched; absent when not a repo. */\n gitignorePath?: string;\n}\n\n/** Normalize a `.gitignore` line for comparison: trim, drop `./` and trailing `/`. */\nfunction normalizeEntry(line: string): string {\n return line.trim().replace(/^\\.\\//, '').replace(/\\/+$/, '');\n}\n\n/**\n * Ensure `entry` is listed in the git repo's root `.gitignore`.\n *\n * Defense-in-depth for credential files (see module docstring). The behaviour is:\n * - Not inside a git work tree → `not-a-repo`, no filesystem change. Git isn't\n * tracking anything here, so there is nothing to protect against.\n * - `.gitignore` missing → it is created containing the entry (`created`).\n * - Entry already present (exact match, ignoring `./` and trailing `/`) →\n * `present`, no write. The operation is idempotent — running `login` twice\n * never duplicates the line.\n * - Otherwise the entry is appended (`added`), preserving existing content and\n * fixing a missing trailing newline first.\n */\nexport function ensureGitignored(\n entry: string,\n startDir: string = process.cwd(),\n): GitignoreResult {\n const root = findGitRoot(startDir);\n if (!root) return { status: 'not-a-repo', entry };\n\n const gitignorePath = path.join(root, '.gitignore');\n const target = normalizeEntry(entry);\n\n let existing = '';\n let fileExisted = true;\n try {\n existing = fs.readFileSync(gitignorePath, 'utf8');\n } catch {\n fileExisted = false;\n }\n\n const alreadyPresent = existing\n .split(/\\r?\\n/)\n .some((line) => normalizeEntry(line) === target);\n if (alreadyPresent) return { status: 'present', entry, gitignorePath };\n\n // Keep the file tidy: ensure the prior content ends with a newline before we\n // append, so we never glue our entry onto an existing last line.\n const needsLeadingNewline = existing.length > 0 && !existing.endsWith('\\n');\n fs.appendFileSync(gitignorePath, `${needsLeadingNewline ? '\\n' : ''}${entry}\\n`, 'utf8');\n\n return { status: fileExisted ? 'added' : 'created', entry, gitignorePath };\n}\n","/**\n * Data-residency region registry (CLI client view).\n *\n * Mirrors the server registry in\n * packages/vibgrate-api/src/lib/regions.ts. The CLI only needs the public\n * routing facts (ingest/dash hostnames + availability); region recommendation\n * is performed server-side via GET /v1/regions.\n *\n * Keep in sync with the API registry and docs/DATA-RESIDENCY.md.\n */\n\nexport type RegionId = 'us' | 'eu' | 'apac';\n\nexport interface CliRegion {\n id: RegionId;\n label: string;\n ingestHost: string;\n dashHost: string;\n available: boolean;\n}\n\nexport const REGIONS: CliRegion[] = [\n {\n id: 'us',\n label: 'United States',\n ingestHost: 'us.ingest.vibgrate.com',\n dashHost: 'dash.vibgrate.com',\n available: true,\n },\n {\n id: 'eu',\n label: 'European Union',\n ingestHost: 'eu.ingest.vibgrate.com',\n dashHost: 'dash.vibgrate.eu',\n available: true,\n },\n {\n id: 'apac',\n label: 'Asia-Pacific (coming soon)',\n ingestHost: 'apac.ingest.vibgrate.com',\n dashHost: 'dash.vibgrate.com',\n available: false,\n },\n];\n\nexport const DEFAULT_REGION: RegionId = 'us';\n\n/** Region ids that are live and selectable today. */\nexport function availableRegionIds(): RegionId[] {\n return REGIONS.filter((r) => r.available).map((r) => r.id);\n}\n\nfunction findRegion(id: string): CliRegion | undefined {\n return REGIONS.find((r) => r.id === id);\n}\n\n/**\n * Resolve the ingest host for a region (or an explicit --ingest URL override).\n *\n * - An explicit `ingest` URL always wins (host is extracted from it).\n * - Otherwise the region must be known AND available.\n */\nexport function resolveIngestHost(region?: string, ingest?: string): string {\n if (ingest) {\n try {\n return new URL(ingest).host;\n } catch {\n throw new Error(`Invalid ingest URL: ${ingest}`);\n }\n }\n const id = (region ?? DEFAULT_REGION).toLowerCase();\n const match = findRegion(id);\n if (!match) {\n throw new Error(`Unknown region \"${id}\". Supported: ${availableRegionIds().join(', ')}`);\n }\n if (!match.available) {\n throw new Error(`Region \"${id}\" (${match.label}) is not yet available. Supported: ${availableRegionIds().join(', ')}`);\n }\n return match.ingestHost;\n}\n\n/** Resolve the dashboard host for a given ingest host (for report links). */\nexport function dashHostForIngestHost(ingestHost: string): string {\n const match = REGIONS.find((r) => r.ingestHost === ingestHost);\n return match?.dashHost ?? 'dash.vibgrate.com';\n}\n\n/**\n * Resolve the ingest host for a known region id, without throwing.\n *\n * Unlike {@link resolveIngestHost}, this never throws and ignores availability:\n * it is used to honour a server-issued residency redirect (a workspace pinned\n * to a region different from the endpoint we reached), so we must be able to\n * route to that region's host even if it is otherwise not user-selectable.\n * Returns `undefined` for an unknown region id.\n */\nexport function ingestHostForRegionId(region: string): string | undefined {\n return findRegion(region.toLowerCase())?.ingestHost;\n}\n","import * as crypto from 'node:crypto';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { writeTextFile } from '../utils/fs.js';\nimport { findGitRoot, ensureGitignored } from '../utils/gitignore.js';\nimport { availableRegionIds, resolveIngestHost } from '../regions.js';\n\n// Re-exported for backwards compatibility with existing importers/tests.\nexport { resolveIngestHost };\n\n/** A freshly provisioned workspace and the credential needed to ingest into it. */\nexport interface ProvisionedWorkspace {\n /** The full DSN string (`vibgrate+https://<keyId>:<secret>@<host>/<workspaceId>`). */\n dsn: string;\n keyId: string;\n workspaceId: string;\n /** The ingest host the workspace was provisioned against (the \"ingest URL\"). */\n ingestHost: string;\n /** The pinned region, or `undefined` for a custom `--ingest` host. */\n region?: string;\n}\n\n/** Mint a fresh keyId/secret pair (keyId: 12 bytes = 24 hex, matches API validation). */\nfunction generateKeyMaterial(): { keyId: string; secret: string } {\n return {\n keyId: crypto.randomBytes(12).toString('hex'),\n secret: crypto.randomBytes(32).toString('hex'),\n };\n}\n\n/** Build a DSN string from its parts. */\nexport function buildDsn(keyId: string, secret: string, ingestHost: string, workspaceId: string): string {\n return `vibgrate+https://${keyId}:${secret}@${ingestHost}/${workspaceId}`;\n}\n\n/**\n * Provision a DSN by calling the API to register the key.\n * This is required when using --workspace new to auto-provision a workspace.\n */\nasync function provisionDsn(\n keyId: string,\n secret: string,\n workspaceId: string,\n ingestHost: string,\n region?: string\n): Promise<{ success: boolean; error?: string }> {\n const url = `https://${ingestHost}/v1/provision`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Connection': 'close', // Prevent keep-alive delays on exit\n },\n // Pin the workspace to the selected region. The API rejects the request\n // if `region` doesn't match the endpoint host (residency guard). For a\n // custom --ingest host we omit it and let the API derive it from the host.\n body: JSON.stringify(region ? { keyId, secret, workspaceId, region } : { keyId, secret, workspaceId }),\n });\n\n if (!response.ok) {\n const result = await response.json() as { error?: string };\n return { success: false, error: result.error || `HTTP ${response.status}` };\n }\n\n return { success: true };\n } catch (e: unknown) {\n return { success: false, error: e instanceof Error ? e.message : String(e) };\n }\n}\n\n/**\n * Provision a brand-new workspace and mint its DSN in the chosen region.\n *\n * Shared by `dsn create --workspace new` and by `login`, which calls this\n * automatically when a freshly-created account has no workspace/DSN yet — so a\n * first-time user is never required to run `dsn create` by hand. Throws an Error\n * with an actionable message (GUARDRAILS §1.3) when resolution or provisioning\n * fails; the caller decides how to surface it.\n */\nexport async function createWorkspaceDsn(opts: { region?: string; ingest?: string }): Promise<ProvisionedWorkspace> {\n const ingestHost = resolveIngestHost(opts.region, opts.ingest);\n const { keyId, secret } = generateKeyMaterial();\n // 16 hex char workspace ID (8 bytes).\n const workspaceId = crypto.randomBytes(8).toString('hex');\n // For a known region we pin it explicitly; for a custom --ingest host the\n // region is left to the API to derive from the host.\n const region = opts.ingest ? undefined : (opts.region ?? 'us').toLowerCase();\n\n const result = await provisionDsn(keyId, secret, workspaceId, ingestHost, region);\n if (!result.success) {\n throw new Error(`Failed to provision workspace: ${result.error}`);\n }\n\n return { dsn: buildDsn(keyId, secret, ingestHost, workspaceId), keyId, workspaceId, ingestHost, region };\n}\n\nexport const dsnCommand = new Command('dsn')\n .description('Manage DSN tokens');\n\ndsnCommand\n .command('create')\n .description('Create a new DSN token')\n .option('--ingest <url>', 'Ingest API URL (overrides --region)')\n .option('--region <region>', `Data residency region (${availableRegionIds().join(', ')})`, 'us')\n .requiredOption('--workspace <id>', 'Workspace ID (use \"new\" to auto-generate)')\n .option('--write <path>', 'Write DSN to file')\n .action(async (opts: { ingest?: string; region: string; workspace: string; write?: string }) => {\n // Generate credentials\n // keyId: 12 bytes = 24 hex chars (matches API validation)\n const keyId = crypto.randomBytes(12).toString('hex');\n const secret = crypto.randomBytes(32).toString('hex');\n\n let ingestHost: string;\n try {\n ingestHost = resolveIngestHost(opts.region, opts.ingest);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n // Handle --workspace new: auto-generate a workspace ID\n let workspaceId = opts.workspace;\n const isNewWorkspace = opts.workspace.toLowerCase() === 'new';\n \n if (isNewWorkspace) {\n // Generate a 16 hex char workspace ID (8 bytes)\n workspaceId = crypto.randomBytes(8).toString('hex');\n console.log(chalk.dim(`Provisioning new workspace ${workspaceId}...`));\n }\n\n // For a known region we pin it explicitly; for a custom --ingest host the\n // region is left to the API to derive from the host.\n const region = opts.ingest ? undefined : opts.region.toLowerCase();\n\n // When using 'new', we must call the provision API\n if (isNewWorkspace) {\n const result = await provisionDsn(keyId, secret, workspaceId, ingestHost, region);\n if (!result.success) {\n console.error(chalk.red(`Failed to provision DSN: ${result.error}`));\n process.exit(1);\n }\n }\n\n const dsn = buildDsn(keyId, secret, ingestHost, workspaceId);\n\n console.log(chalk.green('✔') + ' DSN created');\n console.log('');\n console.log(chalk.bold('Region:'));\n console.log(` ${region ?? 'custom'} (${ingestHost})`);\n console.log('');\n console.log(chalk.bold('DSN:'));\n console.log(` ${dsn}`);\n console.log('');\n console.log(chalk.bold('Key ID:'));\n console.log(` ${keyId}`);\n if (isNewWorkspace) {\n console.log('');\n console.log(chalk.bold('Workspace ID:'));\n console.log(` ${workspaceId}`);\n }\n console.log('');\n console.log(chalk.dim('Set this as VIBGRATE_DSN in your CI environment.'));\n if (!isNewWorkspace) {\n console.log(chalk.dim('The secret must be registered on your Vibgrate ingest API.'));\n }\n\n if (opts.write) {\n const writePath = path.resolve(opts.write);\n await writeTextFile(writePath, dsn + '\\n');\n console.log('');\n console.log(chalk.green('✔') + ` DSN written to ${opts.write}`);\n\n // The DSN is a credential — keep it out of version control automatically\n // (GUARDRAILS §1.1) rather than relying on the user to remember.\n const root = findGitRoot(path.dirname(writePath));\n const rel = root ? path.relative(root, writePath).split(path.sep).join('/') : '';\n if (root && rel && !rel.startsWith('..')) {\n const res = ensureGitignored(rel, path.dirname(writePath));\n if (res.status === 'created') {\n console.log(chalk.green('✔') + ` Created .gitignore and ignored ${rel}`);\n } else if (res.status === 'added') {\n console.log(chalk.green('✔') + ` Added ${rel} to .gitignore`);\n } else if (res.status === 'present') {\n console.log(chalk.dim(` ${rel} is already in .gitignore`));\n }\n } else {\n console.log(\n chalk.yellow('⚠') +\n ' Add this file to .gitignore to keep the DSN out of version control.',\n );\n }\n }\n });\n","/**\n * Local credential storage for `vibgrate login`.\n *\n * The DSN minted by the browser login flow is cached so subsequent\n * `scan`/`push` runs are authenticated without re-pasting a secret. Two stores\n * are supported; the file location resolves in this precedence:\n * 1. the `VIBGRATE_CREDENTIALS` environment variable — an explicit file path\n * (CI / automation / custom setups)\n * 2. the project-local store `<project>/.vibgrate/credentials.json` when the\n * caller opts in (`vg login --local`)\n * 3. an *existing* project-local store — once you have logged in `--local`,\n * later commands in that project pick it up automatically\n * 4. the home store `~/.vibgrate/credentials.json` — the default, matching the\n * usual convention for CLI credentials (`~/.aws/credentials`, `~/.npmrc`)\n *\n * DSN resolution precedence (which credential a command uses) is separate:\n * 1. an explicit `--dsn` flag\n * 2. the `VIBGRATE_DSN` environment variable (CI / automation)\n * 3. the stored login credential (resolved via the file precedence above)\n */\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { findGitRoot } from './utils/gitignore.js';\n\nexport interface StoredCredentials {\n dsn: string;\n workspaceId?: string;\n keyId?: string;\n ingestHost?: string;\n savedAt: string;\n}\n\n/** Options selecting which credential store a call operates on. */\nexport interface CredentialsLocationOpts {\n /**\n * Force the project-local store (`vg login --local`). Without this, writes go\n * to the home store unless `VIBGRATE_CREDENTIALS` is set.\n */\n local?: boolean;\n /**\n * Base directory used to locate the project-local store. Defaults to the git\n * work-tree root above `process.cwd()`, or `process.cwd()` when not in a repo.\n */\n cwd?: string;\n}\n\nconst STORE_DIRNAME = '.vibgrate';\nconst STORE_FILENAME = 'credentials.json';\n\n/** The home-directory store, `~/.vibgrate/credentials.json` (the default). */\nexport function homeCredentialsPath(): string {\n return path.join(os.homedir(), STORE_DIRNAME, STORE_FILENAME);\n}\n\n/**\n * The project-local store, `<project>/.vibgrate/credentials.json`, where\n * `<project>` is the git work-tree root above `cwd` (or `cwd` itself when not\n * inside a repo). Anchoring at the repo root means a `--local` login done at the\n * repo root is still found when a later command runs from a subdirectory.\n */\nexport function projectCredentialsPath(cwd: string = process.cwd()): string {\n const root = findGitRoot(cwd) ?? cwd;\n return path.join(root, STORE_DIRNAME, STORE_FILENAME);\n}\n\n/** Resolve the credentials file to use, honoring the file precedence above. */\nexport function credentialsPath(opts: CredentialsLocationOpts = {}): string {\n const override = process.env.VIBGRATE_CREDENTIALS?.trim();\n if (override) return path.resolve(override);\n const local = projectCredentialsPath(opts.cwd);\n if (opts.local) return local;\n if (fs.existsSync(local)) return local;\n return homeCredentialsPath();\n}\n\nexport function credentialsDir(opts: CredentialsLocationOpts = {}): string {\n return path.dirname(credentialsPath(opts));\n}\n\n/**\n * The `.gitignore` line that keeps a credentials file out of version control,\n * expressed relative to `repoRoot`. Callers only apply this when the file\n * actually lives inside the repo (the project-local store), so the relative\n * path is well-defined; the fallback covers unusual layouts and is intentionally\n * specific — it must NOT shadow `.vibgrate/graph.json`, which `vg share` commits.\n */\nexport function gitignoreEntryForCredentials(\n repoRoot: string,\n credsFile: string = credentialsPath(),\n): string {\n const rel = path.relative(repoRoot, credsFile);\n if (rel && !rel.startsWith('..') && !path.isAbsolute(rel)) {\n return rel.split(path.sep).join('/');\n }\n return `${STORE_DIRNAME}/${STORE_FILENAME}`;\n}\n\nexport function readStoredCredentials(opts: CredentialsLocationOpts = {}): StoredCredentials | null {\n try {\n const raw = fs.readFileSync(credentialsPath(opts), 'utf8');\n const parsed = JSON.parse(raw) as StoredCredentials;\n return parsed && typeof parsed.dsn === 'string' && parsed.dsn ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function writeStoredCredentials(\n creds: StoredCredentials,\n opts: CredentialsLocationOpts = {},\n): void {\n const file = credentialsPath(opts);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n // Created 0600 from the first byte — a default-umask write would leave the\n // token world-readable until the later chmod lands.\n fs.writeFileSync(file, JSON.stringify(creds, null, 2) + '\\n', { encoding: 'utf8', mode: 0o600 });\n // Best-effort: restrict to the owner (no-op on platforms without POSIX perms).\n try {\n fs.chmodSync(file, 0o600);\n } catch {\n /* ignore */\n }\n}\n\nexport function clearStoredCredentials(opts: CredentialsLocationOpts = {}): boolean {\n try {\n fs.rmSync(credentialsPath(opts));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve the DSN to use for an authenticated operation, honoring the precedence\n * above. Returns undefined when no credential is available anywhere.\n */\nexport function resolveDsn(explicitDsn?: string): string | undefined {\n if (explicitDsn) return explicitDsn;\n if (process.env.VIBGRATE_DSN) return process.env.VIBGRATE_DSN;\n return readStoredCredentials()?.dsn ?? undefined;\n}\n","/**\n * Compact UI purpose evidence for efficient LLM inference\n *\n * Reduces token usage by ~80-90% through:\n * 1. Semantic categorization (pricing, auth, dashboard, etc.)\n * 2. Stem-based deduplication\n * 3. Route normalization\n * 4. Top-N sampling per category\n */\n\nimport type { UiPurposeResult, CompactUiPurpose } from '../types.js';\n\n/** Semantic category patterns for grouping evidence */\nconst CATEGORY_PATTERNS: Array<{ category: string; pattern: RegExp }> = [\n { category: 'pricing', pattern: /price|pricing|billing|subscri|trial|credit|plan|tier|upgrade|premium|pro|enterprise/i },\n { category: 'auth', pattern: /sign[- ]?in|sign[- ]?up|log[- ]?in|log[- ]?out|auth|sso|oauth|password|register|invite|onboard/i },\n { category: 'dashboard', pattern: /dashboard|overview|home|main|summary|stats/i },\n { category: 'settings', pattern: /setting|config|preference|option|profile|account/i },\n { category: 'users', pattern: /user|member|team|role|permission|access|admin|owner/i },\n { category: 'integrations', pattern: /integrat|connect|webhook|api[- ]?key|sync|import|export/i },\n { category: 'reports', pattern: /report|analy|metric|chart|graph|insight|track/i },\n { category: 'workflows', pattern: /workflow|automat|schedule|trigger|action|job|task|pipeline/i },\n { category: 'projects', pattern: /project|workspace|organization|folder|repo/i },\n { category: 'navigation', pattern: /menu|nav|sidebar|header|footer|breadcrumb/i },\n];\n\n/**\n * Compact raw UI evidence into a smaller payload for LLM inference\n */\nexport function compactUiPurpose(result: UiPurposeResult, maxSamplesPerCategory = 3): CompactUiPurpose {\n const evidence = result.topEvidence;\n\n // Extract special kinds\n const dependencies = evidence\n .filter((e) => e.kind === 'dependency')\n .map((e) => e.value)\n .slice(0, 10);\n\n const routes = dedupeRoutes(\n evidence.filter((e) => e.kind === 'route').map((e) => e.value),\n ).slice(0, 15);\n\n // Process text evidence\n const textEvidence = evidence.filter(\n (e) => e.kind !== 'dependency' && e.kind !== 'route' && e.kind !== 'feature_flag',\n );\n\n const byCategory = new Map<string, Set<string>>();\n const categoryCounts: Record<string, number> = {};\n\n for (const item of textEvidence) {\n const category = categorize(item.value);\n if (!byCategory.has(category)) {\n byCategory.set(category, new Set());\n }\n const normalized = normalizeValue(item.value);\n if (normalized.length >= 3) {\n byCategory.get(category)!.add(normalized);\n }\n }\n\n // Build samples\n const samples: Array<{ kind: string; value: string; category: string }> = [];\n\n for (const [category, values] of byCategory) {\n const deduped = dedupeStrings([...values]);\n categoryCounts[category] = deduped.length;\n\n for (const value of deduped.slice(0, maxSamplesPerCategory)) {\n samples.push({ kind: 'text', value, category });\n }\n }\n\n // Add feature flag indicator\n const featureFlags = evidence.filter((e) => e.kind === 'feature_flag');\n if (featureFlags.length > 0) {\n categoryCounts['feature_flags'] = featureFlags.length;\n samples.push({ kind: 'feature_flag', value: 'feature flags detected', category: 'feature_flags' });\n }\n\n return {\n samples,\n categoryCounts,\n originalCount: evidence.length,\n dependencies,\n routes,\n detectedFrameworks: result.detectedFrameworks,\n };\n}\n\n/** Categorize a value into semantic buckets */\nfunction categorize(value: string): string {\n for (const { category, pattern } of CATEGORY_PATTERNS) {\n if (pattern.test(value)) return category;\n }\n return 'general';\n}\n\n/** Normalize a value for deduplication */\nfunction normalizeValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 60);\n}\n\n/** Dedupe strings by prefix/stem similarity */\nfunction dedupeStrings(values: string[]): string[] {\n const sorted = values.sort((a, b) => b.length - a.length);\n const kept: string[] = [];\n\n for (const value of sorted) {\n const isDupe = kept.some((k) => {\n const stem = value.slice(0, 6);\n return k.startsWith(stem) || k.includes(value) || value.includes(k);\n });\n if (!isDupe) {\n kept.push(value);\n }\n }\n\n return kept;\n}\n\n/** Dedupe routes by normalized path structure */\nfunction dedupeRoutes(routes: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const route of routes) {\n const normalized = route\n .replace(/:[a-z_]+/gi, ':param')\n .replace(/\\[\\[*\\.*\\.*[a-z_]+\\]*\\]/gi, ':param')\n .replace(/\\/+$/, '')\n .toLowerCase();\n\n if (!seen.has(normalized)) {\n seen.add(normalized);\n result.push(route);\n }\n }\n\n return result;\n}\n","/**\n * Compact scan artifact for efficient upload\n *\n * Reduces artifact size by:\n * 1. Extracting only DB object names (not full CREATE statements)\n * 2. Simplifying API integrations to domains only\n * 3. Using compacted UI purpose evidence\n * 4. Including only first favicon, no logos\n * 5. Capping unbounded arrays\n */\n\nimport * as zlib from 'node:zlib';\nimport { promisify } from 'node:util';\nimport type {\n ScanArtifact,\n DataStoresResult,\n ApiSurfaceResult,\n AssetBrandingResult,\n DatabaseSchemaResult,\n DatabaseSchemaUploadCaps,\n ExtendedScanResults,\n} from '../types.js';\nimport { compactUiPurpose } from './compact-evidence.js';\n\nconst gzip = promisify(zlib.gzip);\n\n/** Max items per array field to prevent bloat */\nconst MAX_ITEMS = 50;\n\n/** Default caps for the `databaseSchema` scanner — a large monorepo can carry\n * hundreds of tables and thousands of columns, so this scanner gets its own\n * (more generous, but still bounded) limits rather than the generic\n * `MAX_ITEMS`. Overridable per-field via `scanners.databaseSchema` in\n * `vibgrate.config.ts` (see DOCS.md § Database Schema), up to\n * `DB_UPLOAD_HARD_CEILING` below. */\nconst MAX_DB_MODELS = 300;\nconst MAX_DB_FIELDS_PER_MODEL = 100;\nconst MAX_DB_MODEL_FILES = 5;\nconst MAX_DB_FILES_SCANNED = 500;\n\n/** Absolute ceiling on the `databaseSchema` upload caps, regardless of what a\n * user configures — mirrored server-side in vibgrate-api's ingest zod schema\n * as a hard `.max()` so a payload can never exceed these bounds even from a\n * misconfigured or non-CLI client. */\nexport const DB_UPLOAD_HARD_CEILING = {\n maxModels: 2000,\n maxFieldsPerModel: 500,\n maxFilesPerModel: 20,\n maxFilesScanned: 5000,\n} as const;\n\nfunction clampCap(configured: number | undefined, fallback: number, ceiling: number): number {\n if (typeof configured !== 'number' || !Number.isFinite(configured) || configured <= 0) return fallback;\n return Math.min(Math.floor(configured), ceiling);\n}\n\n/**\n * Extract just the object name from a \"name (file)\" formatted string\n */\nfunction extractName(entry: string): string {\n const match = entry.match(/^(.+?)\\s*\\(/);\n return match ? match[1].trim() : entry.trim();\n}\n\n/**\n * Compact DataStores result - extract only object names, cap arrays\n */\nexport function compactDataStores(result: DataStoresResult): DataStoresResult {\n return {\n databaseTechnologies: result.databaseTechnologies.slice(0, 10),\n connectionStrings: [], // Don't include connection strings in upload\n connectionPoolSettings: result.connectionPoolSettings.slice(0, MAX_ITEMS),\n replicationSettings: result.replicationSettings.slice(0, 20),\n readReplicaSettings: result.readReplicaSettings.slice(0, 20),\n failoverSettings: result.failoverSettings.slice(0, 20),\n collationAndEncoding: result.collationAndEncoding.slice(0, 20),\n queryTimeoutDefaults: result.queryTimeoutDefaults.slice(0, 20),\n manualIndexes: result.manualIndexes.map(extractName).slice(0, MAX_ITEMS),\n tables: result.tables.map(extractName).slice(0, MAX_ITEMS),\n views: result.views.map(extractName).slice(0, MAX_ITEMS),\n storedProcedures: result.storedProcedures.map(extractName).slice(0, MAX_ITEMS),\n triggers: result.triggers.map(extractName).slice(0, MAX_ITEMS),\n rowLevelSecurityPolicies: result.rowLevelSecurityPolicies.slice(0, 20),\n otherServices: result.otherServices.slice(0, 20),\n };\n}\n\n/**\n * Compact ApiSurface result - simplify to domains, cap arrays\n */\nexport function compactApiSurface(result: ApiSurfaceResult): ApiSurfaceResult {\n // Dedupe integrations by provider domain\n const seenProviders = new Set<string>();\n const uniqueIntegrations = result.integrations.filter((i) => {\n const domain = i.provider.split(':')[0];\n if (seenProviders.has(domain)) return false;\n seenProviders.add(domain);\n return true;\n }).slice(0, MAX_ITEMS).map((i) => ({\n provider: i.provider,\n endpoint: '', // Don't include full endpoints\n version: i.version,\n parameters: [], // Don't include params\n configOptions: [],\n authHints: [],\n files: [], // Don't include file paths\n }));\n\n return {\n integrations: uniqueIntegrations,\n openApiSpecifications: result.openApiSpecifications.slice(0, 10),\n webhookUrls: result.webhookUrls.slice(0, 20),\n callbackEndpoints: result.callbackEndpoints.slice(0, 20),\n apiVersionPins: result.apiVersionPins.slice(0, 20),\n tokenExpirationPolicies: result.tokenExpirationPolicies.slice(0, 20),\n rateLimitOverrides: result.rateLimitOverrides.slice(0, 20),\n customHeaders: result.customHeaders.slice(0, 20),\n corsPolicies: result.corsPolicies.slice(0, 20),\n oauthScopes: result.oauthScopes.slice(0, 20),\n apiTokens: [], // Don't include token references\n };\n}\n\n/**\n * Compact AssetBranding result - first favicon only, no logos\n */\nexport function compactAssetBranding(result: AssetBrandingResult): AssetBrandingResult {\n return {\n faviconFiles: result.faviconFiles.slice(0, 1),\n productLogos: [], // Don't include logos\n };\n}\n\n/**\n * Compact DatabaseSchemaResult — cap models, fields-per-model, and files so a\n * schema-heavy monorepo can't dominate the upload payload. Structural facts\n * only are ever present here to begin with (see `database-schema.ts`); this\n * only trims *how many* of those facts survive, never adds anything new.\n *\n * `caps` lets `scanners.databaseSchema` in `vibgrate.config.ts` raise (or\n * lower) the defaults per-field; each override is clamped to\n * `DB_UPLOAD_HARD_CEILING` so local config can never produce a payload the\n * ingest API's own hard limit would reject outright.\n */\nexport function compactDatabaseSchema(result: DatabaseSchemaResult, caps?: DatabaseSchemaUploadCaps): DatabaseSchemaResult {\n const maxModels = clampCap(caps?.maxModels, MAX_DB_MODELS, DB_UPLOAD_HARD_CEILING.maxModels);\n const maxFieldsPerModel = clampCap(caps?.maxFieldsPerModel, MAX_DB_FIELDS_PER_MODEL, DB_UPLOAD_HARD_CEILING.maxFieldsPerModel);\n const maxFilesPerModel = clampCap(caps?.maxFilesPerModel, MAX_DB_MODEL_FILES, DB_UPLOAD_HARD_CEILING.maxFilesPerModel);\n const maxFilesScanned = clampCap(caps?.maxFilesScanned, MAX_DB_FILES_SCANNED, DB_UPLOAD_HARD_CEILING.maxFilesScanned);\n\n return {\n providers: result.providers.slice(0, MAX_ITEMS),\n models: result.models.slice(0, maxModels).map((model) => ({\n ...model,\n fields: model.fields.slice(0, maxFieldsPerModel),\n files: model.files.slice(0, maxFilesPerModel),\n })),\n enums: result.enums.slice(0, MAX_ITEMS),\n filesScanned: result.filesScanned.slice(0, maxFilesScanned),\n projects: result.projects.slice(0, MAX_ITEMS).map((project) => ({\n project: project.project,\n filesScanned: project.filesScanned.slice(0, MAX_ITEMS),\n models: project.models.slice(0, MAX_ITEMS),\n enums: project.enums.slice(0, MAX_ITEMS),\n })),\n };\n}\n\nexport interface PrepareArtifactForUploadOptions {\n /** Overrides for the `databaseSchema` scanner's upload caps, sourced from\n * `scanners.databaseSchema` in `vibgrate.config.ts`. */\n databaseSchemaCaps?: DatabaseSchemaUploadCaps;\n}\n\n/**\n * Prepare artifact for upload by compacting all extended results\n */\nexport function prepareArtifactForUpload(artifact: ScanArtifact, opts?: PrepareArtifactForUploadOptions): ScanArtifact {\n const compacted = { ...artifact };\n\n if (compacted.extended) {\n const ext: ExtendedScanResults = { ...compacted.extended };\n\n // Compact DataStores\n if (ext.dataStores) {\n ext.dataStores = compactDataStores(ext.dataStores);\n }\n\n // Compact ApiSurface\n if (ext.apiSurface) {\n ext.apiSurface = compactApiSurface(ext.apiSurface);\n }\n\n // Compact AssetBranding\n if (ext.assetBranding) {\n ext.assetBranding = compactAssetBranding(ext.assetBranding);\n }\n\n // Convert UiPurpose to compacted version\n if (ext.uiPurpose) {\n // Replace full UiPurposeResult with CompactUiPurpose structure\n // We store it under the same key but with compacted data\n const compactedUi = compactUiPurpose(ext.uiPurpose);\n // Store as a minimal structure\n ext.uiPurpose = {\n enabled: ext.uiPurpose.enabled,\n detectedFrameworks: compactedUi.detectedFrameworks,\n evidenceCount: compactedUi.originalCount,\n capped: ext.uiPurpose.capped,\n topEvidence: [], // Clear full evidence\n unknownSignals: [],\n // Add compacted data under extended properties\n ...({ compacted: compactedUi } as Record<string, unknown>),\n };\n }\n\n // Cap other potentially large arrays\n if (ext.runtimeConfiguration) {\n ext.runtimeConfiguration = {\n ...ext.runtimeConfiguration,\n environmentVariables: ext.runtimeConfiguration.environmentVariables.slice(0, 100),\n hiddenConfigFiles: ext.runtimeConfiguration.hiddenConfigFiles.slice(0, MAX_ITEMS),\n startupArguments: ext.runtimeConfiguration.startupArguments.slice(0, 100),\n };\n }\n\n if (ext.operationalResilience) {\n const ops = ext.operationalResilience;\n ext.operationalResilience = {\n implicitTimeouts: ops.implicitTimeouts.slice(0, 30),\n defaultPaginationSize: ops.defaultPaginationSize.slice(0, 30),\n implicitRetryLogic: ops.implicitRetryLogic.slice(0, 30),\n defaultLocale: ops.defaultLocale.slice(0, 20),\n defaultCurrency: ops.defaultCurrency.slice(0, 20),\n implicitTimezone: ops.implicitTimezone.slice(0, 20),\n defaultCharacterEncoding: ops.defaultCharacterEncoding.slice(0, 20),\n sessionStores: ops.sessionStores.slice(0, 20),\n distributedLocks: ops.distributedLocks.slice(0, 20),\n jobSchedulers: ops.jobSchedulers.slice(0, 30),\n idempotencyKeys: ops.idempotencyKeys.slice(0, 20),\n rateLimitingCounters: ops.rateLimitingCounters.slice(0, 20),\n circuitBreakerState: ops.circuitBreakerState.slice(0, 20),\n abTestToggles: ops.abTestToggles.slice(0, 20),\n regionalEnablementRules: ops.regionalEnablementRules.slice(0, 20),\n betaAccessGroups: ops.betaAccessGroups.slice(0, 20),\n licensingEnforcementLogic: ops.licensingEnforcementLogic.slice(0, 20),\n killSwitches: ops.killSwitches.slice(0, 20),\n connectorRetryLogic: ops.connectorRetryLogic.slice(0, 20),\n apiPollingIntervals: ops.apiPollingIntervals.slice(0, 20),\n fieldMappings: ops.fieldMappings.slice(0, 20),\n schemaRegistryRules: ops.schemaRegistryRules.slice(0, 20),\n deadLetterQueueBehavior: ops.deadLetterQueueBehavior.slice(0, 20),\n dataMaskingRules: ops.dataMaskingRules.slice(0, 20),\n transformationLogic: ops.transformationLogic.slice(0, 20),\n timezoneHandling: ops.timezoneHandling.slice(0, 20),\n encryptionSettings: ops.encryptionSettings.slice(0, 30),\n hardcodedSecretSignals: ops.hardcodedSecretSignals.slice(0, 20),\n };\n }\n\n // Cap dependencyGraph phantom details\n if (ext.dependencyGraph) {\n ext.dependencyGraph = {\n ...ext.dependencyGraph,\n phantomDependencies: ext.dependencyGraph.phantomDependencies.slice(0, MAX_ITEMS),\n phantomDependencyDetails: ext.dependencyGraph.phantomDependencyDetails?.slice(0, MAX_ITEMS),\n duplicatedPackages: ext.dependencyGraph.duplicatedPackages.slice(0, MAX_ITEMS),\n };\n }\n\n // Cap databaseSchema (models/fields/files) — see compactDatabaseSchema.\n if (ext.databaseSchema) {\n ext.databaseSchema = compactDatabaseSchema(ext.databaseSchema, opts?.databaseSchemaCaps);\n }\n\n compacted.extended = ext;\n }\n\n return compacted;\n}\n\n/**\n * Compress artifact JSON with gzip\n */\nexport async function compressArtifact(artifact: ScanArtifact): Promise<Buffer> {\n const json = JSON.stringify(artifact);\n return gzip(json, { level: 9 });\n}\n\n/**\n * Prepare and compress artifact for upload\n */\nexport async function prepareCompressedUpload(\n artifact: ScanArtifact,\n opts?: PrepareArtifactForUploadOptions,\n): Promise<{ body: Buffer; contentEncoding: 'gzip' }> {\n const compacted = prepareArtifactForUpload(artifact, opts);\n const compressed = await compressArtifact(compacted);\n return { body: compressed, contentEncoding: 'gzip' };\n}\n","/**\n * Scan-artifact upload transport.\n *\n * Centralises the POST /v1/ingest/scan call shared by the `push` and\n * `scan --push` commands, including residency-aware retry: a workspace is\n * pinned to exactly one region, but the DSN (or default) host the CLI uploads\n * to may belong to a different region. When that happens the API rejects the\n * upload with HTTP 409 `REGION_MISMATCH` and names the correct regional\n * endpoint, so we transparently retry against it instead of failing the scan.\n */\n\nimport chalk from 'chalk';\nimport { ingestHostForRegionId } from '../regions.js';\n\nexport interface ScanUploadInput {\n scheme: string;\n host: string;\n keyId: string;\n secret: string;\n body: Buffer;\n contentEncoding: string;\n timestamp: string;\n /** Force a fresh ingest server-side even when the repo is unchanged (skips the\n * duplicate-vcsSha reuse). Set for scheduled and dashboard-triggered scans. */\n force?: boolean;\n /**\n * Run-attribution pair for an automated caller acting on the workspace's\n * behalf (e.g. a Vibgrate-hosted remediation run), read from\n * `VIBGRATE_SCAN_RUN_ID`/`VIBGRATE_SCAN_RUN_TOKEN`. The server verifies the\n * token against the run it minted before granting any exemption — sending\n * an arbitrary or stale value here has no effect, it just fails\n * verification and the scan is billed normally.\n */\n runId?: string;\n runToken?: string;\n}\n\nexport interface ScanUploadResult {\n response: Response;\n /** The host the (final) request was sent to — differs from input.host on a region redirect. */\n host: string;\n}\n\nfunction postOnce(input: ScanUploadInput, host: string): Promise<Response> {\n const url = input.force\n ? `${input.scheme}://${host}/v1/ingest/scan?force=1`\n : `${input.scheme}://${host}/v1/ingest/scan`;\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Encoding': input.contentEncoding,\n 'X-Vibgrate-Timestamp': input.timestamp,\n 'Authorization': `VibgrateDSN ${input.keyId}:${input.secret}`,\n 'Connection': 'close', // Prevent keep-alive delays on exit\n ...(input.runId && input.runToken\n ? { 'X-Vibgrate-Run-Id': input.runId, 'X-Vibgrate-Run-Token': input.runToken }\n : {}),\n },\n body: input.body,\n });\n}\n\n/**\n * Inspect a 409 response for a residency redirect. Returns the correct ingest\n * host only when the response is a `REGION_MISMATCH` that names a region we\n * recognise — we never follow an arbitrary host from the response body.\n */\nasync function regionRedirectHost(response: Response): Promise<string | undefined> {\n try {\n const payload = (await response.clone().json()) as {\n code?: string;\n region?: string;\n };\n if (payload?.code !== 'REGION_MISMATCH' || !payload.region) return undefined;\n return ingestHostForRegionId(payload.region);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Upload a compressed scan artifact, transparently retrying against the\n * workspace's pinned region if the first endpoint reports a residency mismatch.\n */\nexport async function uploadScanArtifact(input: ScanUploadInput): Promise<ScanUploadResult> {\n let host = input.host;\n let response = await postOnce(input, host);\n\n if (response.status === 409) {\n const target = await regionRedirectHost(response);\n if (target && target !== host) {\n console.log(\n chalk.yellow(\n `↻ Workspace is pinned to a different region — retrying upload to ${target}...`,\n ),\n );\n host = target;\n response = await postOnce(input, host);\n }\n }\n\n return { response, host };\n}\n","import * as crypto from 'node:crypto';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile } from '../utils/fs.js';\nimport { resolveIngestHost } from './dsn.js';\nimport { resolveDsn } from '../credentials.js';\nimport { availableRegionIds, dashHostForIngestHost } from '../regions.js';\nimport { prepareCompressedUpload } from '../utils/compact-artifact.js';\nimport { uploadScanArtifact } from '../utils/upload.js';\nimport { loadConfig } from '../../core-open/index.js';\nimport type { ScanArtifact } from '../types.js';\n\ninterface ParsedDsn {\n keyId: string;\n secret: string;\n host: string;\n workspaceId: string;\n scheme: 'https' | 'http';\n}\n\nexport function parseDsn(dsn: string): ParsedDsn | null {\n // vibgrate+https://<key_id>:<secret>@<host>/<workspace_id>\n // vibgrate+http://... allowed for local development\n // Strip invisible/control characters (CR, LF, BOM, zero-width, etc.) that may\n // sneak in from Windows .env files, clipboard pastes, or editor artifacts\n const cleaned = dsn\n .replace(/[\\x00-\\x1F\\x7F\\uFEFF\\u200B-\\u200D\\u2060]/g, '') // control chars, BOM, zero-width\n .trim();\n const match = cleaned.match(/^vibgrate\\+(https?):?\\/\\/([^:]+):([^@]+)@([^/]+)\\/(.+)$/);\n if (!match) return null;\n return {\n scheme: match[1] as 'https' | 'http',\n keyId: match[2]!,\n secret: match[3]!,\n host: match[4]!,\n workspaceId: match[5]!,\n };\n}\n\nexport function computeHmac(body: string, secret: string): string {\n return crypto.createHmac('sha256', secret).update(body).digest('base64');\n}\n\nexport const pushCommand = new Command('push')\n .description('Push scan results to Vibgrate API')\n .option('--dsn <dsn>', 'DSN token (or use VIBGRATE_DSN env)')\n .option('--region <region>', `Override data residency region (${availableRegionIds().join(', ')})`)\n .option('--file <file>', 'Scan artifact file', '.vibgrate/scan_result.json')\n .option('--strict', 'Fail on upload errors')\n .action(async (opts: { dsn?: string; region?: string; file: string; strict?: boolean }) => {\n const dsn = resolveDsn(opts.dsn);\n\n if (!dsn) {\n console.error(chalk.red('No DSN provided.'));\n console.error(chalk.dim('Run \"vibgrate login\", set VIBGRATE_DSN, or use the --dsn flag.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n const parsed = parseDsn(dsn);\n if (!parsed) {\n console.error(chalk.red('Invalid DSN format.'));\n console.error(chalk.dim('Expected: vibgrate+https://<key_id>:<secret>@<host>/<workspace_id>'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n const filePath = path.resolve(opts.file);\n if (!(await pathExists(filePath))) {\n console.error(chalk.red(`Scan artifact not found: ${filePath}`));\n console.error(chalk.dim('Run \"vibgrate scan\" first.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n // Load artifact, compact it, and compress for upload. `databaseSchemaCaps`\n // lets `scanners.databaseSchema` in vibgrate.config.ts (read from the\n // current directory, same as `vg scan`) raise/lower the default upload\n // caps (see DOCS.md § Database Schema).\n const artifact = await readJsonFile<ScanArtifact>(filePath);\n const config = await loadConfig(process.cwd());\n const databaseSchemaCaps = config.scanners !== false ? config.scanners?.databaseSchema : undefined;\n const { body, contentEncoding } = await prepareCompressedUpload(artifact, { databaseSchemaCaps });\n const timestamp = String(Date.now());\n\n // Allow --region to override the host baked into the DSN\n let host = parsed.host;\n if (opts.region) {\n try {\n host = resolveIngestHost(opts.region);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n if (opts.strict) process.exit(1);\n return;\n }\n }\n\n const originalSize = JSON.stringify(artifact).length;\n const compressedSize = body.length;\n const ratio = ((1 - compressedSize / originalSize) * 100).toFixed(0);\n console.log(chalk.dim(`Uploading to ${host}... (${(compressedSize / 1024).toFixed(0)} KB, ${ratio}% smaller)`));\n\n try {\n // Auto-retries against the workspace's pinned region on a 409 REGION_MISMATCH.\n const { response, host: uploadedHost } = await uploadScanArtifact({\n scheme: parsed.scheme,\n host,\n keyId: parsed.keyId,\n secret: parsed.secret,\n body,\n contentEncoding,\n timestamp,\n // Set only by an automated caller running the scan on the workspace's\n // behalf (e.g. a Vibgrate-hosted remediation run) — never a customer flag.\n runId: process.env.VIBGRATE_SCAN_RUN_ID,\n runToken: process.env.VIBGRATE_SCAN_RUN_TOKEN,\n });\n host = uploadedHost;\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const result = await response.json() as { status: string; ingestId?: string };\n console.log(chalk.green('✔') + ` Scan queued for processing (${result.ingestId ?? 'ok'})`);\n \n // Display feedback prompt\n console.log();\n console.log(chalk.dim('Processing continues in the background. Results available shortly.'));\n console.log();\n \n // Show scan report link\n if (result.ingestId) {\n const dashHost = dashHostForIngestHost(host);\n const reportUrl = `https://${dashHost}/${parsed.workspaceId}/scan/${result.ingestId}`;\n console.log(chalk.dim('View report: ') + chalk.underline(reportUrl));\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.red(`Upload failed: ${msg}`));\n if (opts.strict) process.exit(1);\n }\n });\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { projectTypeToVulnEcosystem, severityRank, type ScanArtifact, type VulnEcosystem, type VulnerabilityScanResult, type VulnSeverity } from '../core-open/index.js';\nimport { inventory } from '../engine/drift.js';\n\n/**\n * Offline access to vulnerability data for the local MCP server.\n *\n * The local server never touches the network, so it surfaces whatever the last\n * `vg scan --vulns` wrote to `.vibgrate/scan_result.json`. Absent data means\n * \"not scanned\", never \"no vulnerabilities\".\n */\n\n/** Read the most recent local scan artifact, or null if none/unreadable. */\nexport function readScanArtifact(root: string): ScanArtifact | null {\n try {\n const file = path.join(root, '.vibgrate', 'scan_result.json');\n return JSON.parse(fs.readFileSync(file, 'utf8')) as ScanArtifact;\n } catch {\n return null;\n }\n}\n\n/** The vulnerability scan result from the last scan, or null when not scanned. */\nexport function loadVulnerabilities(root: string): VulnerabilityScanResult | null {\n return readScanArtifact(root)?.extended?.vulnerabilities ?? null;\n}\n\n/** The drift target for a package: ecosystem + installed/latest versions. */\nexport interface PackageTarget {\n ecosystem: VulnEcosystem | 'unknown';\n currentVersion: string | null;\n latestVersion: string | null;\n majorsBehind: number | null;\n}\n\n/**\n * Resolve a package's version/drift target — preferring the last scan artifact\n * (richest: resolved + latest + majors behind), falling back to the offline\n * dependency inventory (installed version + ecosystem).\n */\nexport function resolvePackageTarget(root: string, pkg: string): PackageTarget {\n const artifact = readScanArtifact(root);\n for (const project of artifact?.projects ?? []) {\n const dep = project.dependencies?.find((d) => d.package === pkg);\n if (dep) {\n return {\n ecosystem: projectTypeToVulnEcosystem(project.type) ?? 'unknown',\n currentVersion: dep.resolvedVersion,\n latestVersion: dep.latestStable,\n majorsBehind: dep.majorsBehind,\n };\n }\n }\n const rec = inventory(root).records.find((r) => r.name === pkg);\n if (rec) {\n const ecosystem: VulnEcosystem | 'unknown' = rec.ecosystem === 'npm' ? 'npm' : rec.ecosystem === 'pypi' ? 'pypi' : 'unknown';\n return { ecosystem, currentVersion: rec.installed ?? null, latestVersion: rec.latest ?? null, majorsBehind: null };\n }\n return { ecosystem: 'unknown', currentVersion: null, latestVersion: null, majorsBehind: null };\n}\n\n/** Open advisory ids (with a published fix) for a package, from the last scan. */\nexport function openFixableAdvisories(root: string, pkg: string): string[] {\n const vulns = loadVulnerabilities(root);\n const match = vulns?.packages.find((p) => p.package === pkg);\n return (match?.advisories ?? []).filter((a) => a.fixedVersions.length).map((a) => a.id);\n}\n\n/** Filter a result to advisories at or above a minimum severity (packages with none are dropped). */\nexport function filterBySeverity(result: VulnerabilityScanResult, minSeverity?: VulnSeverity): VulnerabilityScanResult {\n if (!minSeverity || minSeverity === 'unknown') return result;\n const floor = severityRank(minSeverity);\n const packages = result.packages\n .map((p) => ({ ...p, advisories: p.advisories.filter((a) => severityRank(a.severity) >= floor) }))\n .filter((p) => p.advisories.length > 0);\n const totalAdvisories = packages.reduce((n, p) => n + p.advisories.length, 0);\n return { ...result, packages, totalAdvisories };\n}\n","import {\n buildVersionTimelines,\n findPackageTimeline,\n gitHistoryAvailable,\n type GitCommitRef,\n type VulnEcosystem,\n} from '../core-open/index.js';\nimport { inventory, type DriftInventory, type DepRecord, type Ecosystem } from '../engine/drift.js';\n\n/**\n * Git-attribution enrichment for the local MCP server.\n *\n * Adds \"who added this dependency / who set the current version\" to the offline\n * drift inventory by replaying each ecosystem's version timeline. It never writes\n * (no cache) so the MCP stays read-only, and degrades to a plain inventory when\n * git history is unavailable.\n */\n\n/** Bounded history depth for the MCP path (no cache writes, so keep first-call cost in check). */\nconst MCP_MAX_COMMITS = 300;\n\n/** Map the inventory's ecosystem to the timeline/advisory ecosystem (where they differ). */\nconst ECOSYSTEM_MAP: Partial<Record<Ecosystem, VulnEcosystem>> = {\n npm: 'npm',\n pypi: 'pypi',\n go: 'go',\n rust: 'cargo',\n ruby: 'rubygems',\n php: 'composer',\n dotnet: 'nuget',\n dart: 'pub',\n // swift (no advisory ecosystem) and java (no resolved lockfile) have no timeline.\n};\n\ninterface CommitBrief {\n sha: string;\n author: string;\n date: string;\n subject: string;\n}\n\nexport interface AttributedDepRecord extends DepRecord {\n /** Commit that first introduced this dependency (git required). */\n addedBy?: CommitBrief;\n /** Commit that set the currently-installed version. */\n currentVersionBy?: CommitBrief;\n}\n\nfunction brief(commit: GitCommitRef): CommitBrief {\n return { sha: commit.shortSha, author: commit.authorName, date: commit.date, subject: commit.subject };\n}\n\n/**\n * Offline drift inventory, optionally enriched with git attribution.\n * `attribution` reports whether git data was actually applied.\n */\nexport async function attributedInventory(\n root: string,\n opts: { attribute?: boolean } = {},\n): Promise<DriftInventory & { records: AttributedDepRecord[]; attribution: 'git' | 'unavailable' | 'off' }> {\n const inv = inventory(root);\n if (!opts.attribute) return { ...inv, attribution: 'off' };\n if (!(await gitHistoryAvailable(root))) return { ...inv, attribution: 'unavailable' };\n\n const timelines = await buildVersionTimelines(root, { maxCommits: MCP_MAX_COMMITS });\n if (!timelines) return { ...inv, attribution: 'unavailable' };\n\n const records: AttributedDepRecord[] = inv.records.map((r) => {\n const ecosystem = ECOSYSTEM_MAP[r.ecosystem];\n if (!ecosystem) return r;\n const pt = findPackageTimeline(timelines, ecosystem, r.name);\n if (!pt || !pt.changes.length) return r;\n return {\n ...r,\n addedBy: brief(pt.changes[0].commit),\n currentVersionBy: brief(pt.changes[pt.changes.length - 1].commit),\n };\n });\n return { ...inv, records, attribution: 'git' };\n}\n","import { encode, decode } from 'gpt-tokenizer/encoding/cl100k_base';\n\n/**\n * Deterministic, offline, no-key token accounting (VG-LIB-SUPERSET-PLAN D5).\n *\n * Uses the `cl100k_base` BPE (gpt-tokenizer, MIT, zero-dep). This is a *budgeting\n * proxy* — not the target model's exact tokenizer (Claude's isn't public) — which\n * is fine because budgets are enforced against this same counter, deterministically.\n */\n\n/** Exact token count under cl100k_base. */\nexport function countTokens(text: string): number {\n return encode(text).length;\n}\n\nexport interface Truncation {\n text: string;\n truncated: boolean;\n /** Token count of the returned `text` (always ≤ budget when truncated). */\n tokens: number;\n}\n\n/**\n * Truncate `text` to at most `budget` tokens — token-accurate, replacing the old\n * `slice(0, budget * 4)` byte heuristic that under-counted tokens and cut entities\n * mid-line. We decode the kept token prefix, then snap back to the last newline so a\n * code block / entity is never left half-emitted, and append `marker` within budget.\n */\nexport function truncateToTokens(text: string, budget: number, marker = '\\n…(truncated)'): Truncation {\n if (!Number.isFinite(budget) || budget <= 0) return { text, truncated: false, tokens: countTokens(text) };\n const tokens = encode(text);\n if (tokens.length <= budget) return { text, truncated: false, tokens: tokens.length };\n\n const markerTokens = encode(marker).length;\n const keep = Math.max(0, budget - markerTokens);\n let slice = decode(tokens.slice(0, keep));\n // Snap to the last line boundary so we never cut an entity mid-line.\n const lastNl = slice.lastIndexOf('\\n');\n if (lastNl > 0) slice = slice.slice(0, lastNl);\n\n const out = slice + marker;\n return { text: out, truncated: true, tokens: countTokens(out) };\n}\n","/**\n * Weights for the deterministic README/doc section selector (engine/select.ts).\n *\n * These are STATIC NUMBERS applied by plain arithmetic at runtime — no ML, no LLM,\n * no network, no key. They are tuned OFFLINE (scripts/tune-selection.mjs) against a\n * corpus of real READMEs with an oracle, then re-cut into this file per release and\n * version-stamped, so a given CLI version selects byte-deterministically. The corpus\n * and tuner stay server-side (the moat); only the resulting weights ship.\n */\nexport interface SelectionWeights {\n headingUsage: number; // heading looks like usage/example/getting-started/api\n headingPreamble: number; // heading looks like install/license/contributing/badges (negative)\n hasCode: number; // section contains a fenced code block\n codeDensity: number; // per additional code block\n queryOverlap: number; // per distinct query term present\n symbolMatch: number; // per exported symbol name present (from the .d.ts surface)\n position: number; // per section index (negative → earlier slightly preferred)\n linkDensity: number; // link/badge-heavy section (negative)\n}\n\n/** Stamp the weights so output is reproducible per CLI version and tunes are auditable. */\nexport const SELECTION_WEIGHTS_VERSION = '2026.06.26-hand-v1';\n\n/** Hand-set v1 baseline. Superseded by tuned weights once the harness runs on the corpus. */\nexport const DEFAULT_SELECTION_WEIGHTS: SelectionWeights = {\n headingUsage: 4,\n headingPreamble: -6,\n hasCode: 3,\n codeDensity: 0.5,\n queryOverlap: 5,\n symbolMatch: 2,\n position: -0.1,\n linkDensity: -3,\n};\n","import { countTokens, truncateToTokens } from './tokens.js';\nimport { DEFAULT_SELECTION_WEIGHTS, type SelectionWeights } from './selection-weights.js';\n\n/**\n * Deterministic, budget-aware doc selection (VG-LIB-SUPERSET-PLAN §7 / S1.x).\n *\n * Replaces naive prefix truncation — which misses the critical chunk when a long\n * README front-loads badges/TOC/install — with priority-layered, relevance-ranked\n * assembly: the typed API surface leads (it's compact + high-value and must survive\n * a tight budget), then README sections are picked by a deterministic score and\n * emitted in reading order, up to the token budget. No LLM, no network, no key; the\n * scoring weights are static (selection-weights.ts), tuned offline.\n */\n\nexport interface Section {\n heading: string;\n level: number;\n body: string;\n}\n\nconst STOPWORDS = new Set(['the', 'a', 'an', 'to', 'of', 'in', 'for', 'and', 'or', 'is', 'how', 'do', 'i', 'use', 'using', 'with', 'on', 'my']);\nconst USAGE_RE = /\\b(usage|example|examples|quick ?start|getting started|api|guide|how to|reference|tutorial|basic)\\b/i;\nconst PREAMBLE_RE = /\\b(install|installation|license|licence|contributing|contributors?|sponsors?|table of contents|toc|changelog|funding|code of conduct|security|acknowledge)\\b/i;\n\n/** Split markdown at ATX headings; content before the first heading is a level-0 section. */\nexport function splitSections(md: string): Section[] {\n const out: Section[] = [];\n let cur: Section = { heading: '', level: 0, body: '' };\n let buf: string[] = [];\n const flush = (): void => {\n const body = buf.join('\\n').trim();\n if (cur.heading || body) out.push({ heading: cur.heading, level: cur.level, body });\n buf = [];\n };\n for (const line of md.split('\\n')) {\n const h = /^(#{1,6})\\s+(.*\\S)\\s*$/.exec(line);\n if (h) {\n flush();\n cur = { heading: h[2].trim(), level: h[1].length, body: '' };\n } else {\n buf.push(line);\n }\n }\n flush();\n return out;\n}\n\n/**\n * Split a section body into paragraph/code-block units (blank-line separated, fences\n * kept intact). Used to sub-select within a heading-less or oversized section so a\n * buried critical paragraph is still recoverable, not just the prefix.\n */\nexport function chunkBody(body: string): string[] {\n const chunks: string[] = [];\n let cur: string[] = [];\n let inFence = false;\n const flush = (): void => {\n const c = cur.join('\\n').trim();\n if (c) chunks.push(c);\n cur = [];\n };\n for (const line of body.split('\\n')) {\n if (/^\\s*```/.test(line)) inFence = !inFence;\n if (!inFence && line.trim() === '') {\n flush();\n continue;\n }\n cur.push(line);\n }\n flush();\n return chunks;\n}\n\n/** Drop badge/shield-only lines (pure `![..](..)` image rows) — noise, never the answer. */\nexport function stripNoise(body: string): string {\n return body\n .split('\\n')\n .filter((l) => !/^\\s*(?:!\\[[^\\]]*\\]\\([^)]*\\)\\s*)+$/.test(l))\n .join('\\n')\n .trim();\n}\n\nexport function tokenizeQuery(q?: string): string[] {\n if (!q) return [];\n return [...new Set(q.toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length > 1 && !STOPWORDS.has(w)))];\n}\n\n/** Exported identifier names from a `.d.ts` API surface, used as relevance signal. */\nexport function symbolsFromApi(api?: string): string[] {\n if (!api) return [];\n const out = new Set<string>();\n const re = /\\b(?:function|class|interface|type|const|enum|namespace)\\s+([A-Za-z_$][\\w$]*)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(api))) out.add(m[1]);\n return [...out];\n}\n\nexport function scoreSection(s: Section, idx: number, queryTerms: string[], symbols: string[], w: SelectionWeights): number {\n const text = `${s.heading}\\n${s.body}`.toLowerCase();\n let score = 0;\n if (USAGE_RE.test(s.heading)) score += w.headingUsage;\n if (PREAMBLE_RE.test(s.heading)) score += w.headingPreamble;\n const codeBlocks = Math.floor((s.body.match(/```/g) ?? []).length / 2);\n if (codeBlocks > 0) score += w.hasCode + Math.min(codeBlocks, 5) * w.codeDensity;\n for (const t of queryTerms) if (text.includes(t)) score += w.queryOverlap;\n for (const sym of symbols) if (sym.length > 2 && text.includes(sym.toLowerCase())) score += w.symbolMatch;\n score += idx * w.position;\n const links = (s.body.match(/\\]\\(|https?:\\/\\//g) ?? []).length;\n const lineCount = Math.max(1, s.body.split('\\n').filter((l) => l.trim()).length);\n if (links / lineCount > 0.5) score += w.linkDensity;\n return score;\n}\n\nexport interface SelectInput {\n readme: string;\n query?: string;\n /** Verbatim `.d.ts` API surface (leads the payload, survives tight budgets). */\n apiSurface?: string;\n budget?: number;\n weights?: SelectionWeights;\n}\n\nexport interface SelectResult {\n text: string;\n tokens: number;\n truncated: boolean;\n}\n\nconst apiBlock = (api?: string): string => (api ? `## API (types)\\n\\n\\`\\`\\`ts\\n${api}\\n\\`\\`\\`` : '');\n\n/**\n * Assemble docs to a token budget. Unbudgeted → README then API (familiar full\n * output). Budgeted → API surface first (priority), then README sections ranked by\n * score and emitted in reading order, until the budget is hit.\n */\nexport function selectForBudget(input: SelectInput): SelectResult {\n const w = input.weights ?? DEFAULT_SELECTION_WEIGHTS;\n const api = apiBlock(input.apiSurface);\n const readme = input.readme.trim();\n\n if (!input.budget || !Number.isFinite(input.budget)) {\n const full = [readme, api].filter(Boolean).join('\\n\\n');\n return { text: full, tokens: countTokens(full), truncated: false };\n }\n const budget = input.budget;\n const queryTerms = tokenizeQuery(input.query);\n const symbols = symbolsFromApi(input.apiSurface);\n\n const render = (s: Section): string => {\n const body = stripNoise(s.body);\n if (!body) return ''; // heading-only / badge-only sections carry no answer\n return `${s.heading ? `## ${s.heading}\\n` : ''}${body}`.trim();\n };\n\n // Drop preamble (install/license/TOC/contributing/badges) ALWAYS — never the answer.\n const sections = splitSections(readme).filter((s) => !PREAMBLE_RE.test(s.heading));\n\n // If everything that matters (API + non-preamble, noise-stripped sections) fits the\n // budget, return it whole in reading order — preamble-trimmed, but NOT \"truncated\".\n const full = [api, ...sections.map(render)].filter(Boolean).join('\\n\\n').trim();\n if (countTokens(full) <= budget) {\n return { text: full, tokens: countTokens(full), truncated: false };\n }\n\n // Over budget → relevance-ranked assembly. Expand oversized / heading-less sections into\n // paragraph units so a buried critical paragraph is still recoverable (not just the prefix).\n const units: Section[] = [];\n for (const s of sections) {\n if (countTokens(s.body) > budget) {\n chunkBody(s.body).forEach((p, i) => units.push({ heading: i === 0 ? s.heading : '', level: s.level, body: p }));\n } else {\n units.push(s);\n }\n }\n const ranked = units\n .map((s, idx) => ({ s, idx, score: scoreSection(s, idx, queryTerms, symbols, w) }))\n .sort((a, b) => b.score - a.score || a.idx - b.idx);\n\n const out: string[] = [];\n let used = 0;\n const add = (chunk: string): boolean => {\n const t = countTokens(chunk);\n if (used + t <= budget) {\n out.push(chunk);\n used += t;\n return true;\n }\n return false;\n };\n\n // Layer 1: API surface leads (truncate only if it alone exceeds the budget).\n if (api && !add(api) && used < budget) {\n out.push(truncateToTokens(api, budget - used).text);\n used = budget;\n }\n\n // Layer 2: greedily pick top-scored units within budget, emit in document order.\n const picked: number[] = [];\n for (const { s, idx } of ranked) {\n const chunk = render(s);\n if (!chunk) continue;\n if (used + countTokens(`\\n${chunk}`) <= budget) {\n picked.push(idx);\n used += countTokens(`\\n${chunk}`);\n }\n }\n picked.sort((a, b) => a - b);\n for (const idx of picked) out.push(render(units[idx]));\n\n // Use leftover budget on a truncated head of the top-ranked unpicked unit.\n if (used < budget - 20) {\n const next = ranked.find((r) => !picked.includes(r.idx) && render(r.s));\n if (next) {\n const head = truncateToTokens(render(next.s), budget - used).text;\n if (head.trim()) out.push(head);\n }\n }\n\n const text = out.join('\\n\\n').trim();\n return { text, tokens: countTokens(text), truncated: true };\n}\n","import { countTokens } from './tokens.js';\nimport { tokenizeQuery } from './select.js';\n\n/**\n * Deterministic quality gate for locally-extracted docs (VG-LIB-SUPERSET-PLAN D1/D18).\n *\n * Decides whether the on-disk extraction is good enough to serve, or whether we should\n * **fall through to the hosted catalog** (S2) for a better answer. Pure regex/keyword\n * checks — no LLM, no network — so the decision is free and deterministic. A doc is\n * \"sufficient\" when it shows a runnable example, isn't a stub, and is on-topic for the\n * query; otherwise it's a candidate for hosted escalation.\n */\nexport interface DocQuality {\n score: number;\n sufficient: boolean;\n reasons: string[]; // why it fell short (empty when sufficient)\n}\n\nexport interface QualityOpts {\n name?: string;\n query?: string;\n symbols?: string[];\n minTokens?: number;\n}\n\nexport function assessDocQuality(content: string, opts: QualityOpts = {}): DocQuality {\n const minTokens = opts.minTokens ?? 60;\n const lc = content.toLowerCase();\n const reasons: string[] = [];\n let score = 0;\n\n // 1. Has a runnable example (fenced or indented code) — docs without one are low-value.\n const hasCode = /```/.test(content) || /(^|\\n)( {4}|\\t)\\S/.test(content);\n if (hasCode) score += 2;\n else reasons.push('no code example');\n\n // 2. Not a stub.\n const tokens = countTokens(content);\n if (tokens >= minTokens) score += 1;\n else reasons.push(`thin (${tokens} tokens)`);\n\n // 3. Mentions the library itself.\n const bareName = opts.name?.toLowerCase().replace(/^@[^/]+\\//, '');\n if (bareName && bareName.length > 1) {\n if (lc.includes(bareName)) score += 1;\n else reasons.push('library name absent');\n }\n\n // 4. On-topic for the query (if one was given).\n const qt = tokenizeQuery(opts.query);\n let onTopic = qt.length === 0;\n if (qt.length) {\n const hits = qt.filter((t) => lc.includes(t)).length;\n if (hits) {\n score += Math.min(hits, 2);\n onTopic = true;\n } else {\n reasons.push('query terms absent');\n }\n }\n\n // 5. Surfaces at least one real API symbol (when we have a .d.ts surface).\n if (opts.symbols?.length) {\n if (opts.symbols.some((s) => s.length > 2 && lc.includes(s.toLowerCase()))) score += 1;\n else reasons.push('no API symbols present');\n }\n\n // Gate: a usable doc has an example, isn't a stub, and is on-topic.\n const sufficient = hasCode && tokens >= minTokens && onTopic;\n return { score, sufficient, reasons };\n}\n","/**\n * Hosted catalog fall-through client (VG-LIB-SUPERSET-PLAN D7/D18, S2.4).\n *\n * The CLI is local-first: it serves the on-disk answer for free, offline, no key. This\n * client is the OPT-IN escalation seam — only consulted when (a) the user passed `--online`\n * (and not `--local`), AND (b) the deterministic quality gate (engine/quality.ts) judged the\n * local extraction insufficient. It calls the public hosted catalog (the §4 canonical shape\n * over HTTP) and returns a better answer, or `null`.\n *\n * Hard guarantees: it NEVER throws and NEVER blocks the local path — any failure (offline,\n * timeout, non-200, unparseable, not-yet-deployed) resolves to `null`, so `vg lib` always\n * still prints the best local answer. No key is sent; the public catalog is anonymous (the\n * no-key funnel, D7).\n *\n * Endpoint: the SAME regional ingest host the CLI already uses for `scan`/`push`\n * (`us.ingest.vibgrate.com` by default, region-aware), resolved via `resolveIngestHost` —\n * the lib catalog rides the existing API surface rather than a separate host. Overridable\n * by `--region`/`--ingest` (like scans) or `VIBGRATE_LIB_HOST`.\n */\nimport { resolveIngestHost } from '../reporting/regions.js';\n\nexport interface HostedDocsRequest {\n name?: string;\n targetId?: string;\n query?: string;\n verbosity?: 'concise' | 'balanced' | 'exhaustive';\n maxTokens?: number;\n}\n\nexport interface HostedDocsResult {\n content: string;\n version: string | null;\n source: 'hosted';\n metadata?: Record<string, unknown>;\n}\n\nexport interface HostedOptions {\n /** Raw base URL override; else VIBGRATE_LIB_HOST env; else the resolved ingest host. */\n base?: string;\n /** Data-residency region (us/eu/…), same as scans. Defaults to us. */\n region?: string;\n /** Explicit ingest URL override (host extracted), same as scans (wins over region). */\n ingest?: string;\n /** Optional DSN identity — sends the `VibgrateDSN` header so the call gets the workspace tier. */\n auth?: { keyId: string; secret: string };\n timeoutMs?: number;\n /** Injectable for tests; defaults to global fetch (undefined → disabled, returns null). */\n fetchImpl?: typeof fetch;\n}\n\n/** Resolve the hosted base URL: explicit base / env → the regional ingest host (default us). */\nexport function hostedBase(opts: { base?: string; region?: string; ingest?: string } = {}): string {\n const explicit = opts.base || process.env.VIBGRATE_LIB_HOST;\n if (explicit) return explicit.replace(/\\/+$/, '');\n let host: string;\n try {\n host = resolveIngestHost(opts.region, opts.ingest); // same host the CLI uses for scan/push\n } catch {\n host = 'us.ingest.vibgrate.com'; // fail safe to the default region\n }\n return `https://${host}`;\n}\n\n/**\n * Ask the hosted catalog for docs. Returns the hosted answer, or `null` on ANY failure\n * (so the caller keeps the local answer). Never throws.\n */\nexport async function fetchHostedDocs(req: HostedDocsRequest, opts: HostedOptions = {}): Promise<HostedDocsResult | null> {\n const f = opts.fetchImpl ?? (globalThis.fetch as typeof fetch | undefined);\n if (!f) return null; // no fetch available → stay local\n const url = `${hostedBase(opts)}/v1/lib/docs`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 4000);\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n if (opts.auth) {\n // Identify the workspace for higher rate limits + tracking (same DSN auth as scan/push).\n headers['Authorization'] = `VibgrateDSN ${opts.auth.keyId}:${opts.auth.secret}`;\n headers['X-Vibgrate-Timestamp'] = String(Date.now());\n }\n try {\n const res = await f(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n name: req.name,\n targetId: req.targetId,\n query: req.query,\n verbosity: req.verbosity,\n max_tokens: req.maxTokens,\n }),\n signal: ctrl.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { content?: unknown; docs?: unknown; version?: unknown; metadata?: unknown };\n const content = typeof data.content === 'string' ? data.content : typeof data.docs === 'string' ? data.docs : '';\n if (!content.trim()) return null;\n return {\n content,\n version: typeof data.version === 'string' ? data.version : null,\n source: 'hosted',\n metadata: (data.metadata as Record<string, unknown> | undefined) ?? undefined,\n };\n } catch {\n return null; // offline / timeout / parse error — fail closed to local\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport interface PublishRequest {\n name: string;\n version: string;\n readme?: string;\n dts?: string;\n compliance?: string[];\n language?: string;\n sourceUrl?: string;\n}\nexport interface PublishOk {\n ok: true;\n targetId: string;\n ecosystem: string;\n entities: number;\n indexedTokens: number;\n}\nexport interface PublishErr {\n ok: false;\n status: number;\n error?: string;\n message?: string;\n}\n\n/**\n * Publish a PRIVATE library to the hosted catalog (`POST /v1/lib/private`, S6). Unlike the read\n * path, this is an explicit user write, so it SURFACES errors (no fail-closed): a DSN is required\n * (workspace identity), the workspace must be on a paid plan (402), and the result reports the\n * indexed token cost charged to the MCP-token meter.\n */\nexport async function publishPrivateLibrary(req: PublishRequest, opts: HostedOptions = {}): Promise<PublishOk | PublishErr> {\n const f = opts.fetchImpl ?? (globalThis.fetch as typeof fetch | undefined);\n if (!f) return { ok: false, status: 0, message: 'no network available' };\n if (!opts.auth) return { ok: false, status: 401, message: 'a DSN is required to publish a private library (run `vibgrate login` or set VIBGRATE_DSN)' };\n const url = `${hostedBase(opts)}/v1/lib/private`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 15000);\n try {\n const res = await f(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n Authorization: `VibgrateDSN ${opts.auth.keyId}:${opts.auth.secret}`,\n 'X-Vibgrate-Timestamp': String(Date.now()),\n },\n body: JSON.stringify({\n name: req.name,\n version: req.version,\n readme: req.readme,\n dts: req.dts,\n compliance: req.compliance,\n language: req.language,\n sourceUrl: req.sourceUrl,\n }),\n signal: ctrl.signal,\n });\n const data = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) return { ok: false, status: res.status, error: typeof data.error === 'string' ? data.error : undefined, message: typeof data.message === 'string' ? data.message : undefined };\n return {\n ok: true,\n targetId: String(data.targetId ?? ''),\n ecosystem: String(data.ecosystem ?? ''),\n entities: Number(data.entities) || 0,\n indexedTokens: Number(data.indexedTokens) || 0,\n };\n } catch (err) {\n return { ok: false, status: 0, message: err instanceof Error ? err.message : 'request failed' };\n } finally {\n clearTimeout(timer);\n }\n}\n","/**\n * On-disk TTL cache for hosted `/v1/lib/docs` answers, so repeat lookups of the same library\n * docs are instant and offline-tolerant. Lives under `.vibgrate/cache/` (gitignored, like the\n * parse cache) and is a pure performance layer: a cache miss falls through to `fetchHostedDocs`,\n * every failure path degrades to \"no cache\" (never throws, never blocks the local-first answer),\n * and entries expire after `ttlMs` so version bumps and catalog refreshes surface within a day.\n *\n * Keying is exact-request: name/targetId/query/verbosity/budget PLUS the resolved host and the\n * caller's DSN key id — a workspace-tier answer (which may include PRIVATE docs) is never served\n * to a different identity or an anonymous call from the cache.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { cacheDir } from './cache.js';\nimport { fetchHostedDocs, hostedBase, type HostedDocsRequest, type HostedDocsResult, type HostedOptions } from './hosted.js';\n\nconst CACHE_VERSION = 'vg-hosted-docs/1';\n/** Default freshness window — hosted docs change at most with catalog re-ingests. */\nexport const HOSTED_DOCS_TTL_MS = 24 * 60 * 60 * 1000;\n/** Bounded file size: oldest entries are evicted beyond this. */\nconst MAX_ENTRIES = 64;\n\ninterface CacheEntry {\n at: number;\n result: HostedDocsResult;\n}\ninterface CacheFile {\n version: string;\n entries: Record<string, CacheEntry>;\n}\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'hosted-docs.json');\n}\n\n/** Deterministic cache key over the request identity (see module doc for why auth is included). */\nexport function hostedDocsCacheKey(req: HostedDocsRequest, opts: HostedOptions = {}): string {\n const material = JSON.stringify([\n req.name ?? '',\n req.targetId ?? '',\n req.query ?? '',\n req.verbosity ?? '',\n req.maxTokens ?? 0,\n hostedBase(opts),\n opts.auth?.keyId ?? 'anon',\n ]);\n return createHash('sha256').update(material).digest('hex');\n}\n\nfunction loadFile(root: string): CacheFile {\n try {\n const parsed = JSON.parse(fs.readFileSync(cachePath(root), 'utf8')) as CacheFile;\n if (parsed && parsed.version === CACHE_VERSION && parsed.entries && typeof parsed.entries === 'object') return parsed;\n } catch {\n /* missing or corrupt — start fresh */\n }\n return { version: CACHE_VERSION, entries: {} };\n}\n\nfunction saveFile(root: string, file: CacheFile): void {\n try {\n // Evict oldest beyond the cap so the file stays small.\n const keys = Object.keys(file.entries);\n if (keys.length > MAX_ENTRIES) {\n for (const k of keys.sort((a, b) => file.entries[a].at - file.entries[b].at).slice(0, keys.length - MAX_ENTRIES)) {\n delete file.entries[k];\n }\n }\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(cachePath(root), JSON.stringify(file));\n } catch {\n /* a failed cache write must never fail the lookup */\n }\n}\n\nexport interface HostedCacheOptions extends HostedOptions {\n /** Freshness window; entries older than this re-fetch. Default HOSTED_DOCS_TTL_MS. */\n ttlMs?: number;\n /** Injectable clock for tests. */\n now?: () => number;\n /** Skip reading (still writes) — e.g. an explicit refresh. */\n bypass?: boolean;\n}\n\n/**\n * `fetchHostedDocs` behind the disk cache: a fresh hit answers instantly (flagged\n * `metadata.cached: true`); a miss fetches and caches only REAL answers (nulls — offline,\n * rate-capped, not found — are never cached, so the next call retries).\n */\nexport async function fetchHostedDocsCached(root: string, req: HostedDocsRequest, opts: HostedCacheOptions = {}): Promise<HostedDocsResult | null> {\n const now = opts.now ?? Date.now;\n const ttl = opts.ttlMs ?? HOSTED_DOCS_TTL_MS;\n const key = hostedDocsCacheKey(req, opts);\n const file = loadFile(root);\n\n if (!opts.bypass) {\n const hit = file.entries[key];\n if (hit && now() - hit.at < ttl && hit.result?.content) {\n return { ...hit.result, metadata: { ...(hit.result.metadata ?? {}), cached: true } };\n }\n }\n\n const result = await fetchHostedDocs(req, opts);\n if (result) {\n file.entries[key] = { at: now(), result };\n saveFile(root, file);\n }\n return result;\n}\n","/**\n * Centralised rendering for local `vg serve` MCP tool results.\n *\n * Token economy (why this module exists): a tool result is not paid for once.\n * It is sent to the model when the tool returns, then re-sent inside the\n * conversation context on *every subsequent assistant turn* for the rest of the\n * session. So a few hundred wasted tokens in one response are paid dozens of\n * times over. Cheap, mostly-lossless levers live here:\n *\n * 1. **Compact serialisation** (`toolResult`). The text block has no\n * pretty-print indentation — pure whitespace the model never reasons over.\n * Byte-for-byte lossless; see `response.test.ts` for the measured reduction.\n *\n * 2. **Empty-field compaction** (`compactResult`). Drops `null`/empty fields the\n * model can't use — the upload path's redundancy-stripping applied to MCP.\n *\n * 3. **Token ceiling** (`clampToBudget`). The offline counterpart of the hosted\n * server's 25k-token budget, so no single result can flood the window.\n *\n * 4. **Honest list bounds** (`boundList`). Caps an array while always reporting\n * the true total, so elision is visible and the model can ask for more.\n *\n * `renderToolResult` runs 1–3 together; tools opt into `boundList` where needed.\n *\n * Determinism: compact `JSON.stringify` preserves key insertion order; pruning\n * and trimming keep stable prefixes, so output stays stable for equal input.\n */\n\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { countTokens } from '../engine/tokens.js';\n\n/**\n * Hard token ceiling for any single local tool result — the offline counterpart\n * of the hosted MCP's 25,000-token budget (GUARDRAILS §2.3). The local server\n * had no ceiling, so a hub `get_node` or a monorepo-wide `check_drift` could\n * return an unbounded payload. `clampToBudget` enforces this for every tool.\n */\nexport const MAX_RESULT_TOKENS = 25_000;\n\n/**\n * Render a handler's return value into the MCP tool-result shape, applying the\n * full token-economy pipeline: drop empty/absent fields (`compactResult`),\n * enforce the token ceiling (`clampToBudget`), then serialise compactly. The\n * text block and `structuredContent` are the *same* shaped object, so a\n * structured-aware host and a text-only host see identical data.\n */\nexport function renderToolResult(result: unknown, maxTokens = MAX_RESULT_TOKENS): CallToolResult {\n return toolResult(clampToBudget(compactResult(result), maxTokens));\n}\n\n/**\n * Low-level renderer: compact JSON in the text block (token-lean);\n * `structuredContent` carries the same object for programmatic hosts. Prefer\n * `renderToolResult`, which also compacts and clamps.\n */\nexport function toolResult(result: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(result) }],\n structuredContent: asStructured(result),\n };\n}\n\n/**\n * Drop fields that carry no information for the model — `null`/`undefined`,\n * empty strings, empty arrays, and empty objects — recursively. This is the\n * upload path's \"don't ship empties / cap redundancy\" philosophy applied to\n * MCP responses (the upload's scan-artifact compactors target data the local\n * server never serves, so the *technique*, not that code, is what transfers).\n *\n * Lossless for an AI consumer: an absent field reads identically to an explicit\n * `null`/empty. Meaningful falsy values (`false`, `0`) are preserved.\n */\nexport function compactResult<T>(value: T): T {\n return prune(value) as T;\n}\n\nfunction prune(v: unknown): unknown {\n if (Array.isArray(v)) return v.map(prune);\n if (v && typeof v === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, raw] of Object.entries(v as Record<string, unknown>)) {\n const pv = prune(raw);\n if (!isEmpty(pv)) out[k] = pv;\n }\n return out;\n }\n return v;\n}\n\nfunction isEmpty(v: unknown): boolean {\n if (v === null || v === undefined || v === '') return true;\n if (Array.isArray(v)) return v.length === 0;\n if (typeof v === 'object') return Object.keys(v as object).length === 0;\n return false; // false / 0 / non-empty values are meaningful\n}\n\n/**\n * Enforce a token ceiling on an object-shaped result by trimming its heaviest\n * array fields (halving the largest token contributor until under budget) and\n * recording what was elided under `_truncated`. Array-rooted results (the\n * `list_*` tools) are already bounded by their own `limit`, so they pass\n * through untouched. Deterministic: trimming keeps a stable prefix.\n */\nexport function clampToBudget<T>(value: T, maxTokens = MAX_RESULT_TOKENS): T {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value;\n if (tokensOf(value) <= maxTokens) return value;\n\n const obj: Record<string, unknown> = { ...(value as Record<string, unknown>) };\n const truncated: Record<string, { shown: number; total: number }> = {};\n // Bounded loop: each pass halves one array, so it converges quickly.\n for (let guard = 0; guard < 64 && tokensOf(obj) > maxTokens; guard++) {\n const arrays = Object.entries(obj).filter(\n (e): e is [string, unknown[]] => Array.isArray(e[1]) && e[1].length > 0,\n );\n if (arrays.length === 0) break; // nothing left to trim\n arrays.sort((a, b) => tokensOf(b[1]) - tokensOf(a[1]));\n const [field, arr] = arrays[0];\n const total = truncated[field]?.total ?? arr.length;\n const shown = Math.max(1, Math.floor(arr.length / 2));\n obj[field] = arr.slice(0, shown);\n truncated[field] = { shown, total };\n }\n if (Object.keys(truncated).length) obj._truncated = truncated;\n return obj as T;\n}\n\nfunction tokensOf(v: unknown): number {\n return countTokens(JSON.stringify(v));\n}\n\n/** structuredContent must be an object; wrap arrays/primitives so it always is. */\nexport function asStructured(result: unknown): Record<string, unknown> {\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n return { result };\n}\n\nexport interface Bounded<T> {\n /** At most `max` items, in the input's (already deterministic) order. */\n items: T[];\n /** The true count before bounding — never silently dropped. */\n total: number;\n}\n\n/**\n * Cap a list to `max` items while reporting the real total. Callers surface\n * both `items` and `total` so truncation is always visible to the model.\n */\nexport function boundList<T>(items: T[], max: number): Bounded<T> {\n if (!Number.isFinite(max) || max < 0 || items.length <= max) {\n return { items, total: items.length };\n }\n return { items: items.slice(0, max), total: items.length };\n}\n\n/**\n * Default cap for a single node's relationship arrays (`calls`/`calledBy`). A\n * central hub can have hundreds of callers; the first N ranked entries answer\n * almost every question, and the total tells the model when to dig deeper\n * (e.g. via `impact_of`).\n */\nexport const NODE_EDGE_CAP = 50;\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 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', '.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 // Literal-sweep routing. Three shapes 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 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 queries stay symbol-first: file:line and\n // 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 isPhrase = Boolean(quoted) || /\\s/.test(q) || (/[/\\\\]/.test(q) && !q.includes(':') && !/[*?]/.test(q));\n\n // Pass 1 — graph name index (already ranked by importance).\n let nodes = findNodes(graph, q).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, q);\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, q);\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(q);\n if (tokens.length >= 2) nodes = multiTokenNodes(graph, tokens);\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 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, q);\n if (spare > 0 && !skipScan) {\n const seen = new Set(symbolHits.map((h) => `${h.file}:${h.line}`));\n const scan = await scanFiles(root, q, spare, seen, textHits, isPhrase);\n truncatedScan = scan.truncated;\n if (isPhrase) totalTextMatches = scan.total;\n }\n\n const matches = [...symbolHits, ...textHits];\n if (matches.length === 0) {\n return {\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 }\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 }).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 { cwd: root, encoding: 'utf8', timeout: 15_000, maxBuffer: 32 * 1024 * 1024 },\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","import { queryGraph, queryGraphSemantic } from '../engine/query.js';\nimport { loadEmbedder, getNodeEmbeddings, isModelReady, withTimeout, type Embedder } from '../engine/embeddings.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { indexFor } from '../engine/relations.js';\nimport { shortestPath } from '../engine/paths.js';\nimport { impactOf } from '../engine/impact.js';\nimport { coveringTests } from '../engine/test-query.js';\nimport { loadVulnerabilities, filterBySeverity, resolvePackageTarget, openFixableAdvisories } from './vuln-data.js';\nimport { attributedInventory } from './attribution.js';\nimport { computeUpgradeImpact, getChangelogSignals, type VulnSeverity } from '../core-open/index.js';\nimport { discoverModels } from '../engine/models.js';\nimport { FREE_PACK } from '../grounding/pack.js';\nimport { loadCatalog, resolveLib, readDoc, driftFor, resolveVersion, localPackageDocs, localApiSurface } from '../engine/lib.js';\nimport { selectForBudget, symbolsFromApi } from '../engine/select.js';\nimport { assessDocQuality } from '../engine/quality.js';\nimport { fetchHostedDocsCached } from '../engine/hosted-cache.js';\nimport { resolveDsn } from '../reporting/credentials.js';\nimport { parseDsn } from '../reporting/commands/push.js';\nimport { boundList, NODE_EDGE_CAP } from './response.js';\nimport { searchSymbols } from '../engine/search.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The read-only tool set for the LOCAL `vg serve` MCP. Every tool is\n * side-effect-free and `readOnlyHint: true` (auto-approvable), and independent of\n * Vibgrate's hosted cloud MCP. The server is local-first; network access is\n * limited to the embedder's one-time model fetch, `upgrade_impact`'s `changelog`\n * option, and `library_docs`' hosted-catalog fall-through on a thin/missing local\n * doc — all disabled under `--local` (the hard airgap).\n *\n * Phase 2/3 add `tests_for`, `get_facts`, `guide_node`, `check_drift`,\n * `list_models`, `resolve_library`, `library_docs`.\n */\n\nexport interface ToolContext {\n /** Project root (for filesystem-backed tools: drift, models). */\n root: string;\n /** `--local`: keep the server air-gapped — no model download, lexical only. */\n local?: boolean;\n /** `--dedup`: collapse a node's heavy relation lists on repeat reads this session. */\n dedup?: boolean;\n /** Per-session set of node ids already returned in full (drives `--dedup`). */\n seen?: Set<string>;\n}\n\nexport interface VgTool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (graph: VgGraph, args: Record<string, unknown>, ctx: ToolContext) => unknown | Promise<unknown>;\n}\n\n/**\n * Embedder shared across calls of a long-running `vg serve` — loaded once\n * (model fetched on first use, then cached/offline), so semantic queries don't\n * re-init the model per request. `null` once we know the backend is unavailable\n * (unsupported platform / no model) so we stop retrying and use lexical.\n */\n/**\n * In-memory embedder, loaded from the on-disk cache only (never a network\n * download on the request path). Resolved once and reused; `null` while the\n * model is not yet available.\n */\nlet warmEmbedder: Promise<Embedder | null> | null = null;\nlet bgWarmStarted = false;\n\n/**\n * Kick a one-time background model download so future navigation calls can go\n * semantic — without ever blocking the current call on it. Safe to call\n * repeatedly (single-flight) and from server startup. No-op under `--local`.\n */\nexport function warmEmbedderInBackground(local?: boolean): void {\n if (local || bgWarmStarted || isModelReady()) return;\n bgWarmStarted = true;\n // Allows the network fetch; populates the shared disk cache + the machine\n // readiness marker. Failure just leaves us on the lexical floor.\n loadEmbedder({})\n .then((e) => {\n if (e) warmEmbedder = Promise.resolve(e);\n })\n .catch(() => {\n bgWarmStarted = false; // let a later call retry the warm\n });\n}\n\n/**\n * The embedder IF it can be had without a network download — cached in memory,\n * or loadable from the on-disk model cache. When the model isn't ready, returns\n * `null` immediately and starts a background warm. A cold model download can\n * take tens of seconds; blocking a navigation call on it is what made `orient`\n * hang and return nothing in CI, so the request path never waits for it.\n */\nfunction readyEmbedder(local?: boolean): Promise<Embedder | null> {\n if (warmEmbedder) return warmEmbedder;\n if (local) return (warmEmbedder = loadEmbedder({ local, noDownload: true }));\n if (isModelReady()) return (warmEmbedder = loadEmbedder({ noDownload: true }));\n warmEmbedderInBackground(local);\n return Promise.resolve(null);\n}\n\n/**\n * Resolve a question to ranked matches: semantic when the embedder is warm, else\n * the deterministic lexical floor.\n *\n * Two guarantees keep this from ever hard-failing a navigation call — the\n * failure mode that made the agent abandon the graph and re-discover by grep\n * (observed in CI: `orient` returned nothing, so the model paid for both):\n * 1. it never waits on a cold model download (readyEmbedder is non-blocking);\n * 2. any fault in the semantic path (embedding, vector I/O) degrades to lexical.\n * Lexical always answers, so orient/query_graph always return content.\n */\nasync function retrieve(graph: VgGraph, question: string, budget: number, ctx: ToolContext) {\n let mode = 'lexical';\n try {\n const q = await withTimeout(\n (async () => {\n const embedder = await readyEmbedder(ctx.local);\n if (!embedder) return null;\n // First call on a fresh repo embeds every node here; withTimeout does not\n // cancel it, so the work continues in the background and caches to disk —\n // this call answers lexically, the next hits the warm cache and is fast.\n const nodeVectors = await getNodeEmbeddings(graph, embedder, ctx.root);\n const r = await queryGraphSemantic(graph, question, { budget, embedder, nodeVectors });\n mode = `semantic (${embedder.id})`;\n return r;\n })(),\n SEMANTIC_BUDGET_MS,\n 'semantic path over budget',\n );\n if (q) return { q, mode };\n } catch {\n // Over the latency budget or a semantic fault — answer from the lexical floor.\n }\n return { q: queryGraph(graph, question, { budget }), mode: 'lexical' };\n}\n\n/**\n * Hard latency ceiling for the semantic path on a navigation call. If loading\n * the model into memory + embedding the corpus + the query doesn't finish inside\n * this, we answer lexically now and let the (uncancelled) embedding warm the\n * on-disk cache for the next call. Prevents the first `orient` on a fresh,\n * un-embedded repo from blocking past the MCP client timeout (which surfaced as\n * a zero-length result and made the agent fall back to grep). Override via\n * VG_SEMANTIC_BUDGET_MS.\n */\nconst SEMANTIC_BUDGET_MS = (() => {\n const n = Number(process.env.VG_SEMANTIC_BUDGET_MS);\n return Number.isFinite(n) && n > 0 ? n : 4000;\n})();\n\n// Schema bytes are billed to the agent on EVERY model step, so this surface is\n// kept deliberately lean: short descriptions, param notes only where they\n// disambiguate, and no empty `required` arrays. Back-compat alias keys stay in\n// the schemas (additionalProperties is false) but carry no descriptions.\nconst obj = (properties: Record<string, unknown>, required: string[] = []) => ({\n type: 'object',\n properties,\n ...(required.length ? { required } : {}),\n additionalProperties: false,\n});\n\n/** Concise-by-default response shaping (plan P2): ids/names/counts first;\n * bodies, full context blocks and long relation lists are opt-in per call. */\nconst RESPONSE_FORMAT = { type: 'string', enum: ['concise', 'detailed'] };\nconst isDetailed = (args: Record<string, unknown>): boolean => args.response_format === 'detailed';\n/** Top-N default for ranked lists under concise (opt up via limit). */\nconst CONCISE_MATCHES = 5;\n\n/** Evidence tiers an agent can filter edges by (schema.ts EpistemicTier). */\nconst EPISTEMIC_TIERS = ['observed', 'name-matched', 'declared'] as const;\n/** Shared schema fragment: the two optional edge-assurance filters. */\nconst EDGE_FILTER_SCHEMA = {\n min_edge_confidence: { type: 'number', description: '0..1 — drop edges below this confidence' },\n epistemic: { type: 'string', enum: EPISTEMIC_TIERS, description: 'keep only edges of this evidence tier' },\n};\n/**\n * Predicate over `{edge}` records for `get_node`'s call/calledBy filtering. Reads\n * `min_edge_confidence` / `epistemic` defensively; absent → keep everything\n * (unchanged behaviour). Lets an agent request only high-assurance edges, e.g.\n * `epistemic:\"observed\"` for resolver-confirmed calls only.\n */\nfunction edgeRecordFilter(args: Record<string, unknown>): (x: { edge: { confidence: number; epistemic?: string } }) => boolean {\n const min = numOrU(args.min_edge_confidence);\n const tier = (EPISTEMIC_TIERS as readonly string[]).includes(String(args.epistemic)) ? String(args.epistemic) : undefined;\n if (min == null && !tier) return () => true;\n return (x) => (min == null || x.edge.confidence >= min) && (!tier || x.edge.epistemic === tier);\n}\n\nexport const TOOLS: VgTool[] = [\n {\n name: 'orient',\n description:\n 'Start here: one call returns the map overview, ranked matches for your question, and the top hit’s blast radius — replaces summary+query+impact round-trips.',\n // `query` is a no-description back-compat alias for `question`: the sibling\n // discovery tools (search_symbols, resolve_library) take `query`, so an agent\n // naturally reaches for it here too — accepting it turns what was a wasted\n // \"question is required\" round-trip into a hit. Neither is `required` (either\n // satisfies the in-handler check), matching library_docs/resolve_library.\n inputSchema: obj({\n question: { type: 'string', maxLength: 300 },\n query: { type: 'string', maxLength: 300 },\n scope: { type: 'string', description: 'path prefix to orient within' },\n budget: { type: 'number', description: 'token budget in detailed mode (default 1500)' },\n response_format: RESPONSE_FORMAT,\n }),\n handler: async (graph, args, ctx) => {\n const question = String(args.question ?? args.query ?? '');\n if (!question) return { error: 'bad_request', message: 'question is required' };\n const budget = numOr(args.budget, 1500);\n // Semantic when available, else lexical — and never throws (see retrieve).\n const { q, mode } = await retrieve(graph, question, budget, ctx);\n // Normalise scope. An agent naturally passes \".\" (or \"./\") for \"here\" —\n // but file paths are repo-relative (\"src/…\"), so a literal startsWith(\".\")\n // matched nothing and silently zeroed the whole result. Treat \".\", \"./\"\n // and \"\" as the whole graph; strip a leading \"./\" from a real subdir.\n const rawScope = String(args.scope ?? '').trim();\n const scope = rawScope === '.' || rawScope === './' ? '' : rawScope.replace(/^\\.\\//, '');\n const scoped = scope ? q.matches.filter((m) => m.node.file.startsWith(scope)) : q.matches;\n const detailed = isDetailed(args);\n // Blast radius is a `detailed` concern. On the common \"find it → read →\n // edit\" path the concise caller needs the location, not what a change\n // there would touch — surfacing the ripple invites impact-exploration the\n // task doesn't need. Computing impactOf only when asked also skips the\n // traversal per call.\n let topImpact = null;\n const top = scoped[0]?.node;\n if (detailed && top) {\n const r = impactOf(graph, top.id, { depth: 3 });\n topImpact = { node: top.qualifiedName, direct: r.direct, transitive: r.transitive, affected: r.affected.slice(0, 10).map(stripId) };\n }\n const shown = detailed ? scoped : scoped.slice(0, CONCISE_MATCHES);\n return {\n // Concise \"find X\" calls need a one-line map (counts + languages), not the\n // full topAreas/topHubs blocks — those were ~half of every orient\n // response's tokens on the hot discovery path and the caller navigates by\n // `matches`. Detailed keeps the full overview.\n summary: detailed ? summarize(graph, 10) : conciseSummary(graph),\n mode,\n // The fact-annotated context block is detail: concise callers navigate\n // by the ranked matches and fetch nodes on demand (plan P2).\n ...(detailed ? { context: q.context } : {}),\n matches: shown.map((m) => ({ name: m.node.qualifiedName, kind: m.node.kind, file: m.node.file, line: m.node.span.start, score: m.score })),\n // A neutral availability flag, not a directive to keep querying: a\n // retrieval tool that coaches \"narrow the question / see more\" nudges the\n // over-navigation that re-bills the whole context on every extra step.\n ...(scoped.length > shown.length ? { moreAvailable: true } : {}),\n ...(detailed ? { topImpact } : {}),\n };\n },\n },\n {\n name: 'search_symbols',\n description:\n 'Find a known name or literal string fast: ranked symbol lookup, plus a complete literal file-search for any quoted, multi-word, or path-like query (config keys, routes, log lines, UI copy). Quote a single name (\"AddJwtBearer\") to sweep every occurrence of it as text. A sweep reports totalTextMatches so you know you have every occurrence — use it instead of grep. Use first for most discovery; use query_graph for meaning.',\n inputSchema: obj(\n {\n query: { type: 'string', maxLength: 120, description: 'a symbol name, or a literal phrase to sweep for every occurrence of' },\n limit: { type: 'number', description: 'default 8, max 50 (raise it to fetch a whole literal sweep in one call)' },\n },\n ['query'],\n ),\n handler: async (graph, args, ctx) => {\n const limit = Math.min(50, numOr(args.limit, 8));\n return searchSymbols(graph, ctx.root, String(args.query ?? ''), limit);\n },\n },\n {\n name: 'query_graph',\n description: 'Find code by meaning when you don’t know the name: symptoms, relationships, what-breaks-if. For a known name or literal string use search_symbols.',\n // `query` is a no-description back-compat alias for `question` (see orient):\n // sibling tools take `query`, so accept it here rather than reject the call.\n inputSchema: obj({\n question: { type: 'string', maxLength: 300 },\n query: { type: 'string', maxLength: 300 },\n limit: { type: 'number', description: 'ranked matches to return (default 5)' },\n offset: { type: 'number' },\n budget: { type: 'number', description: 'context-block token budget in detailed mode (default 2000)' },\n response_format: RESPONSE_FORMAT,\n }),\n handler: async (graph, args, ctx) => {\n const question = String(args.question ?? args.query ?? '');\n if (!question) return { mode: 'lexical', matches: [], hint: 'question (or query) is required' };\n const budget = numOr(args.budget, 2000);\n // Semantic by default (local model, cached/offline after first use); falls\n // back to the deterministic lexical floor if the backend is unavailable or\n // faults — retrieve() never throws, so the tool never hard-fails.\n const { q: r, mode } = await retrieve(graph, question, budget, ctx);\n // Structured pivot instead of an empty result (plan P2): the model should\n // switch tools, not retry the same query harder.\n if (r.matches.length === 0) {\n return { mode, matches: [], hint: 'no semantic match — for a known name or literal string use search_symbols; otherwise rephrase around the behaviour you observe' };\n }\n const limit = numOr(args.limit, CONCISE_MATCHES);\n const offset = Math.max(0, numOrU(args.offset) ?? 0);\n const page = r.matches.slice(offset, offset + limit);\n return {\n mode,\n summary: `${r.matches.length} match${r.matches.length === 1 ? '' : 'es'}; top: ${r.matches[0]!.node.qualifiedName}`,\n // The fact-annotated context block is detail (plan P2): ranked matches\n // first, fetch nodes on demand.\n ...(isDetailed(args) ? { context: r.context, tokensEstimate: r.tokensEstimate } : {}),\n matches: page.map((m) => ({ name: m.node.qualifiedName, kind: m.node.kind, file: m.node.file, line: m.node.span.start, score: m.score })),\n // Neutral pagination fact (nextOffset if the model genuinely needs more),\n // not a \"narrow the question\" nudge that invites another discovery round.\n ...(offset + page.length < r.matches.length ? { moreAvailable: true, nextOffset: offset + page.length } : {}),\n };\n },\n },\n {\n name: 'get_node',\n description: 'Inspect one symbol: signature, callers, callees, area. Accepts name, file:line, glob or id.',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n ...EDGE_FILTER_SCHEMA,\n response_format: RESPONSE_FORMAT,\n },\n ['name'],\n ),\n handler: (graph, args, ctx) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const index = indexFor(graph);\n // Optional edge-assurance filter: keep only calls/callers at/above a\n // confidence floor and/or of a given evidence tier, before mapping to names.\n const edgeOk = edgeRecordFilter(args);\n const calleeRecs = index.callees(node.id).filter(edgeOk);\n const callerRecs = index.callers(node.id).filter(edgeOk);\n const base = {\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n signature: node.signature ?? null,\n importance: node.importance,\n isHub: node.isHub,\n area: node.area,\n };\n // `--dedup`: if this exact node (content-addressed id) was already\n // returned in full this session, the model already has its relations —\n // re-sending them just re-bills the same tokens every turn. Return the\n // lightweight identity plus the totals and a `repeat` flag instead.\n if (ctx?.dedup && ctx.seen?.has(node.id)) {\n return { ...base, repeat: true, callsTotal: uniqueNames(calleeRecs.map((x) => x.node.qualifiedName)).length, calledByTotal: uniqueNames(callerRecs.map((x) => x.node.qualifiedName)).length };\n }\n // Bound the relationship arrays: a hub can have hundreds of callers, and\n // every one is paid for on every subsequent turn. Concise shows the top\n // CONCISE_MATCHES with true totals; detailed widens to NODE_EDGE_CAP\n // (the model can widen the blast radius further with `impact_of`).\n const edgeCap = isDetailed(args) ? NODE_EDGE_CAP : CONCISE_MATCHES;\n const calls = boundList(uniqueNames(calleeRecs.map((x) => x.node.qualifiedName)), edgeCap);\n const calledBy = boundList(uniqueNames(callerRecs.map((x) => x.node.qualifiedName)), edgeCap);\n ctx?.seen?.add(node.id);\n return {\n ...base,\n calls: calls.items,\n callsTotal: calls.total,\n calledBy: calledBy.items,\n calledByTotal: calledBy.total,\n };\n },\n },\n {\n name: 'find_path',\n description: 'Shortest connection from a to b.',\n inputSchema: obj(\n {\n a: { type: 'string' },\n b: { type: 'string' },\n pick_a: { type: 'number' },\n pick_b: { type: 'number' },\n },\n ['a', 'b'],\n ),\n handler: (graph, args) => {\n const ra = resolveOne(graph, String(args.a ?? ''), numOrU(args.pick_a));\n const rb = resolveOne(graph, String(args.b ?? ''), numOrU(args.pick_b));\n if (!ra.node) return { endpoint: 'a', ...unresolved(ra.candidates) };\n if (!rb.node) return { endpoint: 'b', ...unresolved(rb.candidates) };\n const result = shortestPath(graph, ra.node.id, rb.node.id);\n if (!result) return { connected: false };\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n return { connected: true, direction: result.direction, path: result.ids.map((id) => byId.get(id)?.qualifiedName ?? id) };\n },\n },\n {\n name: 'impact_of',\n description: 'Blast radius of a change: what breaks if this symbol changes — dependents, files, covering tests, risk.',\n inputSchema: obj(\n {\n name: { type: 'string' },\n change_type: { type: 'string', enum: ['modify', 'delete', 'rename', 'add_dependency'] },\n depth: { type: 'number', description: 'default 4' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n min_edge_confidence: { type: 'number', description: '0..1 — drop dependents below this (decayed) confidence' },\n response_format: RESPONSE_FORMAT,\n },\n ['name'],\n ),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const changeType = ['modify', 'delete', 'rename', 'add_dependency'].includes(String(args.change_type))\n ? String(args.change_type)\n : 'modify';\n const r = impactOf(graph, node.id, { depth: numOr(args.depth, 4) });\n // Optional assurance floor: drop dependents whose (distance-decayed) edge\n // confidence is below the requested threshold. Filtered in the handler —\n // impact.ts is unchanged. Recompute the direct/transitive tallies so the\n // decision contract (riskLevel, summary) reflects only the kept rows.\n const minConf = numOrU(args.min_edge_confidence);\n if (minConf != null) {\n const kept = r.affected.filter((a) => a.confidence >= minConf);\n r.affected = kept;\n r.direct = kept.filter((i) => i.depth === 1).length;\n r.transitive = kept.filter((i) => i.depth > 1).length;\n // Keep minEdgeConfidence consistent with the kept rows (never report a\n // confidence below the applied floor).\n r.minEdgeConfidence = kept.length ? Math.min(...kept.map((i) => i.confidence)) : 1;\n }\n const tests = coveringTests(graph, node);\n const filesAffected = [...new Set(r.affected.map((a) => a.file))];\n // Decision-shaped contract (plan P2): a rename/delete makes every\n // dependent a compile-break risk; a modify is weighted by fan-in.\n const heavyChange = changeType === 'delete' || changeType === 'rename';\n const riskLevel =\n node.isHub || r.direct >= 10 || r.transitive >= 50 || (heavyChange && r.direct >= 3)\n ? 'high'\n : r.direct >= 3 || r.transitive >= 10\n ? 'medium'\n : 'low';\n const summary =\n `${changeType} ${r.root.name}: ${r.direct} direct dependent${r.direct === 1 ? '' : 's'}, ` +\n `${r.transitive} transitive across ${filesAffected.length} file${filesAffected.length === 1 ? '' : 's'}; ` +\n `${tests.length} covering test${tests.length === 1 ? '' : 's'} — ${riskLevel} risk.`;\n return {\n root: r.root.name,\n changeType,\n directCallers: r.direct,\n transitiveCount: r.transitive,\n filesAffected: filesAffected.slice(0, 20),\n testsAffected: tests.length,\n riskLevel,\n summary,\n // The full row set is detail; concise callers act on the contract above.\n ...(isDetailed(args)\n ? { affected: r.affected.slice(0, 100).map(stripId) }\n : r.affected.length > 0\n ? { hint: 'response_format:\"detailed\" lists the affected nodes' }\n : {}),\n };\n },\n },\n {\n name: 'tests_for',\n description: 'Which tests cover this symbol — is a change here tested?',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n response_format: RESPONSE_FORMAT,\n },\n ['name'],\n ),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const covers = coveringTests(graph, node);\n return {\n node: node.qualifiedName,\n tested: node.tested,\n coverage: node.coverage ?? null,\n testCount: covers.length,\n covers: isDetailed(args) ? covers : covers.slice(0, 10),\n ...(covers.length > 10 && !isDetailed(args) ? { moreAvailable: true } : {}),\n ...(covers.length === 0 ? { hint: 'no covering tests found — a change here lands untested' } : {}),\n };\n },\n },\n {\n name: 'get_graph_summary',\n description: 'Code map overview: counts, languages, top areas and hubs.',\n inputSchema: obj({}),\n handler: (graph) => summarize(graph),\n },\n {\n name: 'list_areas',\n description: 'Code areas (communities) by size.',\n inputSchema: obj({ limit: { type: 'number' } }),\n // Strip `members` (raw content-hash id arrays): a model cannot use them and\n // on a large repo they ballooned this result past 20k tokens.\n handler: (graph, args) =>\n [...graph.areas]\n .sort((a, b) => b.size - a.size)\n .slice(0, numOr(args.limit, 30))\n .map((a) => ({ id: a.id, label: a.label, size: a.size, cohesion: a.cohesion, externalEdges: a.externalEdges })),\n },\n {\n name: 'list_hubs',\n description: 'Most-depended-on symbols.',\n inputSchema: obj({ limit: { type: 'number' } }),\n handler: (graph, args) =>\n graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance)\n .slice(0, numOr(args.limit, 20))\n .map((n) => ({ name: n.qualifiedName, kind: n.kind, file: n.file, line: n.span.start, importance: n.importance, isHub: n.isHub })),\n },\n {\n name: 'get_facts',\n description: 'Deterministic facts for a node (contract/invariant); needs a --deep build.',\n inputSchema: obj({ name: { type: 'string' } }, ['name']),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''));\n if (!node) return unresolved(candidates);\n if (!graph.facts) return { node: node.qualifiedName, facts: [], note: 'facts require a --deep build' };\n return { node: node.qualifiedName, facts: graph.facts.filter((f) => f.subjectIds.includes(node.id)) };\n },\n },\n {\n name: 'guide_node',\n description: 'Cited standards/practices for a node (OWASP/CWE).',\n inputSchema: obj({ name: { type: 'string' } }, ['name']),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''));\n if (!node) return unresolved(candidates);\n const entries = new Map(FREE_PACK.entries.map((e) => [e.id, e]));\n return {\n node: node.qualifiedName,\n guidance: (graph.grounding ?? [])\n .filter((g) => g.src === node.id)\n .map((g) => ({ kind: g.kind, rationale: g.rationale, confidence: g.confidence, summary: entries.get(g.packEntryId)?.summary ?? '', citation: g.citation })),\n };\n },\n },\n {\n name: 'check_drift',\n description: 'Offline dependency inventory (npm/pypi/go); attribute:true adds git who-added attribution.',\n inputSchema: obj(\n { attribute: { type: 'boolean' } },\n [],\n ),\n handler: (_graph, args, ctx) => attributedInventory(ctx.root, { attribute: args.attribute === true }),\n },\n {\n name: 'vuln_attribution',\n description: 'Who introduced each open vulnerability, exposure windows, and CRA remediation metrics (MTTR, SLA breaches). Reads the last `vg scan --vulns`.',\n inputSchema: obj({ package: { type: 'string', description: 'restrict to one package' } }, []),\n handler: (_graph, args, ctx) => {\n const data = loadVulnerabilities(ctx.root);\n if (!data) {\n return {\n status: 'not_scanned',\n message: 'No vulnerability data found. Run `vg scan --vulns` first (attribution needs git history at scan time).',\n };\n }\n const only = args.package ? String(args.package) : null;\n const packages = (only ? data.packages.filter((p) => p.package === only) : data.packages).map((p) => ({\n ecosystem: p.ecosystem,\n package: p.package,\n installedVersion: p.version,\n advisories: p.advisories.map((a) => ({\n id: a.id,\n cve: a.aliases.find((x) => x.startsWith('CVE-')) ?? null,\n severity: a.severity,\n cvss: a.cvss,\n exposureDays: a.exposureDays ?? null,\n introduced: a.introduced ?? null,\n fixedVersions: a.fixedVersions,\n })),\n }));\n return { status: 'ok', source: data.source, cra: data.cra ?? null, packages };\n },\n },\n {\n name: 'list_vulnerabilities',\n description: 'Known vulnerabilities from the last `vg scan --vulns`: id/CVE, severity, CVSS, fixed version.',\n inputSchema: obj(\n { severity: { type: 'string', enum: ['low', 'moderate', 'high', 'critical'], description: 'minimum severity' } },\n [],\n ),\n handler: (_graph, args, ctx) => {\n const data = loadVulnerabilities(ctx.root);\n if (!data) {\n return {\n status: 'not_scanned',\n message: 'No vulnerability data found. Run `vg scan --vulns` first (online OSV, or offline with a --package-manifest carrying advisories).',\n };\n }\n const filtered = filterBySeverity(data, args.severity as VulnSeverity | undefined);\n return {\n status: 'ok',\n source: filtered.source,\n totalAdvisories: filtered.totalAdvisories,\n affectedPackages: filtered.packages.length,\n severityCounts: filtered.severityCounts,\n packages: filtered.packages.map((p) => ({\n ecosystem: p.ecosystem,\n package: p.package,\n installedVersion: p.version,\n advisories: p.advisories.map((a) => ({\n id: a.id,\n cve: a.aliases.find((x) => x.startsWith('CVE-')) ?? null,\n severity: a.severity,\n cvss: a.cvss,\n fixedVersions: a.fixedVersions,\n summary: a.summary,\n })),\n })),\n };\n },\n },\n {\n name: 'upgrade_impact',\n description: 'What breaks if you upgrade a package: major distance, import blast radius, vulns fixed, recommended posture. changelog:true adds GitHub breaking-change signals (online).',\n inputSchema: obj(\n {\n package: { type: 'string' },\n changelog: { type: 'boolean' },\n },\n ['package'],\n ),\n handler: async (_graph, args, ctx) => {\n const pkg = String(args.package ?? '');\n if (!pkg) return { error: 'bad_request', message: 'package is required' };\n const target = resolvePackageTarget(ctx.root, pkg);\n const fixesVulnerabilities = openFixableAdvisories(ctx.root, pkg);\n const impact = computeUpgradeImpact(ctx.root, { package: pkg, ...target }, { fixesVulnerabilities });\n // Online breaking-change signals are strictly opt-in and never run under --local.\n const changelog =\n args.changelog === true && !ctx.local && target.ecosystem !== 'unknown'\n ? await getChangelogSignals(target.ecosystem, pkg, target.currentVersion, target.latestVersion)\n : undefined;\n return { status: 'ok', ...impact, ...(changelog ? { changelog } : {}) };\n },\n },\n {\n name: 'list_models',\n description: 'Local models on disk (Ollama / LM Studio / gguf).',\n inputSchema: obj({}),\n handler: () => ({ models: discoverModels() }),\n },\n {\n name: 'resolve_library',\n description:\n 'Resolve a library to its canonical id and the version YOUR project uses (drift-annotated). ' +\n 'Call once per library and reuse the returned targetId for every library_docs follow-up — never guess an id.',\n // Canonical §4: `query` (+ optional `context_project`). `name` kept as a back-compat alias.\n inputSchema: obj(\n {\n query: {\n type: 'string',\n description: 'the package name as written in the dependency file. Good: \"react-hook-form\". Bad: \"forms\"',\n },\n name: { type: 'string' },\n context_project: { type: 'string' },\n },\n [],\n ),\n handler: (_graph, args, ctx) => {\n const query = String(args.query ?? args.name ?? '');\n if (!query) return { error: 'bad_request', message: 'query is required' };\n const ver = resolveVersion(ctx.root, query);\n const entry = resolveLib(loadCatalog(ctx.root), query);\n if (entry) {\n const drift = driftFor(ctx.root, entry);\n return {\n targetId: entry.id,\n id: entry.id, // back-compat\n name: entry.name,\n resolvedVersion: ver.served ?? entry.version,\n version: entry.version, // back-compat\n isInstalled: ver.installed != null,\n driftStatus: driftStatusOf(drift),\n drift,\n version_mismatch: ver.mismatch ?? null,\n source: 'catalog',\n };\n }\n const local = localPackageDocs(ctx.root, query);\n if (local) {\n return {\n targetId: query,\n name: query,\n resolvedVersion: local.version ?? ver.served ?? null,\n isInstalled: true,\n driftStatus: 'unknown',\n version_mismatch: ver.mismatch ?? null,\n source: local.source,\n };\n }\n return { error: 'not_found' };\n },\n },\n {\n name: 'library_docs',\n description:\n 'Version-correct usage docs for a library, sliced to a token budget — official content matched to ' +\n 'the version this project has installed, not web-search results. Ask a focused question via query; ' +\n 'one call usually answers. After 2 calls without the section you need, stop and read the package ' +\n 'source under node_modules instead of searching again.',\n // Canonical §4: `targetId`/`query`, `verbosity`, `max_tokens`. `name`/`tokens` kept as aliases.\n inputSchema: obj(\n {\n targetId: { type: 'string', description: 'id from resolve_library (preferred over query)' },\n query: {\n type: 'string',\n description:\n 'the library plus the specific need. Good: \"zod refine custom error message\". Bad: \"zod\" or \"docs\"',\n },\n name: { type: 'string' },\n context_project: { type: 'string' },\n verbosity: { type: 'string', enum: ['concise', 'balanced', 'exhaustive'] },\n // Tolerant on purpose: models often send budgets as strings — the\n // handler coerces, so don't fail validation over \"4000\" vs 4000.\n max_tokens: { type: ['number', 'string'], description: 'token budget (a numeric string is accepted)' },\n tokens: { type: ['number', 'string'] },\n enterprise_strict: { type: 'boolean' },\n follow_up: { type: 'boolean' },\n },\n [],\n ),\n handler: (_graph, args, ctx) => {\n const id = String(args.targetId ?? args.query ?? args.name ?? '');\n if (!id) return { error: 'bad_request', message: 'targetId or query is required' };\n const query = String(args.query ?? args.name ?? '');\n // Adaptive default: a focused question gets a `concise` slice (the ranked\n // sections that answer it); a bare \"give me the docs\" keeps `balanced` so\n // breadth isn't lost. Either is overridable via `verbosity`/`max_tokens`.\n const verbosity = ['concise', 'balanced', 'exhaustive'].includes(String(args.verbosity))\n ? (String(args.verbosity) as keyof typeof VERBOSITY_BUDGET)\n : query\n ? 'concise'\n : 'balanced';\n const budget = numOrU(args.max_tokens) ?? numOrU(args.tokens) ?? VERBOSITY_BUDGET[verbosity];\n const ver = resolveVersion(ctx.root, id);\n const render = (readme: string, libName: string) => {\n const apiSurface = localApiSurface(ctx.root, libName);\n const sel = selectForBudget({ readme, query, apiSurface, budget });\n // Quality gate (D18): assess the FULL local extraction (README + API surface), not the\n // budget-trimmed slice — this decides whether the local doc can answer at all. When it\n // can't (no example / stub / query keywords absent), the hosted-catalog escalation\n // below answers instead (unless the server runs air-gapped with --local).\n const quality = assessDocQuality([readme, apiSurface].filter(Boolean).join('\\n\\n'), {\n name: libName,\n query,\n symbols: symbolsFromApi(apiSurface),\n });\n return {\n content: sel.text,\n metadata: {\n verbosity,\n tokens: sel.tokens,\n truncated: sel.truncated,\n quality: { sufficient: quality.sufficient, score: quality.score, reasons: quality.reasons },\n escalate: quality.sufficient ? null : 'hosted',\n },\n };\n };\n\n // 1. Committed catalog (drift-annotated). 2. Local-first: installed package docs on disk.\n const entry = resolveLib(loadCatalog(ctx.root), id);\n let answer: Record<string, unknown> | null = null;\n let sufficient = false;\n if (entry) {\n const r = render(readDoc(ctx.root, entry), entry.name);\n sufficient = r.metadata.quality.sufficient;\n answer = {\n targetId: entry.id,\n name: entry.name,\n version: entry.version,\n source: 'catalog',\n drift: driftFor(ctx.root, entry),\n version_mismatch: ver.mismatch ?? null,\n content: r.content,\n docs: r.content, // back-compat\n metadata: r.metadata,\n };\n } else {\n const local = localPackageDocs(ctx.root, id);\n if (local) {\n const r = render(local.docs, id);\n sufficient = r.metadata.quality.sufficient;\n answer = {\n targetId: id,\n name: id,\n version: local.version ?? ver.served,\n source: local.source,\n version_mismatch: ver.mismatch ?? null,\n content: r.content,\n docs: r.content, // back-compat\n metadata: r.metadata,\n };\n }\n }\n\n // Hosted escalation (S2, wired): consulted only when the local answer is missing or\n // insufficient AND the server isn't air-gapped (`--local`). Disk-cached (24h TTL under\n // .vibgrate/cache) so repeat agent lookups answer instantly; fetchHostedDocsCached fails\n // closed to null, so the best local answer (or not_found) is never broken by the\n // network. The escalation branch is the only async path — the local path stays sync.\n if (!sufficient && !ctx.local) {\n return (async () => {\n const dsn = resolveDsn();\n const parsed = dsn ? parseDsn(dsn) : null;\n const hosted = await fetchHostedDocsCached(\n ctx.root,\n { name: entry?.name ?? id, targetId: entry?.id, query: query || undefined, maxTokens: budget },\n { auth: parsed ? { keyId: parsed.keyId, secret: parsed.secret } : undefined },\n );\n if (hosted) {\n return {\n targetId: entry?.id ?? id,\n name: entry?.name ?? id,\n version: hosted.version ?? ver.served ?? null,\n source: 'hosted',\n version_mismatch: ver.mismatch ?? null,\n content: hosted.content,\n docs: hosted.content, // back-compat\n metadata: { verbosity, escalated: true, ...(hosted.metadata ?? {}) },\n };\n }\n return answer ?? { error: 'not_found' };\n })();\n }\n return answer ?? { error: 'not_found' };\n },\n },\n];\n\n/** Default token budgets by verbosity (canonical §4) when no explicit `max_tokens` is given. */\nconst VERBOSITY_BUDGET = { concise: 1500, balanced: 4000, exhaustive: 12000 } as const;\n\n/** The lean one-line map for concise `orient`: counts + languages, no top lists. */\nfunction conciseSummary(graph: VgGraph) {\n return { counts: graph.meta.counts, languages: graph.meta.languages };\n}\n\n/** Shared map overview used by both `get_graph_summary` and `orient`. */\nfunction summarize(graph: VgGraph, top = 10) {\n return {\n counts: graph.meta.counts,\n languages: graph.meta.languages,\n cluster: graph.meta.cluster,\n resolver: graph.provenance.resolver,\n generatedAt: graph.generatedAt,\n topAreas: [...graph.areas].sort((a, b) => b.size - a.size).slice(0, top).map((a) => ({ id: a.id, label: a.label, size: a.size })),\n topHubs: graph.nodes\n .filter((n) => n.isHub)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, top)\n .map((n) => ({ name: n.qualifiedName, file: n.file, importance: n.importance })),\n };\n}\n\n/** Drop the internal content-hash `id` from an impact item — model noise. */\nfunction stripId<T extends { id?: string }>(item: T): Omit<T, 'id'> {\n const { id: _id, ...rest } = item;\n return rest;\n}\n\n/**\n * The shared \"could not resolve to one node\" payload. Candidates carry\n * kind/file/line — bare qualified names were useless when several nodes share a\n * name (the model saw ten identical strings and had nothing to `pick` by).\n */\nfunction unresolved(candidates: { qualifiedName: string; kind: string; file: string; span: { start: number } }[]) {\n return {\n error: candidates.length ? 'ambiguous' : 'not_found',\n candidates: candidates.slice(0, 10).map((n, i) => ({ pick: i + 1, name: n.qualifiedName, kind: n.kind, file: n.file, line: n.span.start })),\n ...(candidates.length ? { hint: 'call again with pick:<n> or a file:line name' } : {}),\n };\n}\n\n/** Map the internal drift note to the canonical §4 driftStatus vocabulary. */\nfunction driftStatusOf(d: { drift: string }): string {\n if (d.drift === 'current') return 'current';\n if (d.drift === 'behind') return 'outdated';\n if (d.drift === 'ahead') return 'ahead';\n return 'unknown';\n}\n\nfunction numOr(v: unknown, def: number): number {\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? n : def;\n}\nfunction numOrU(v: unknown): number | undefined {\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\nfunction uniqueNames(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\n/**\n * The hot navigation core (plan P3, VG-NAVIGATION-PROFILE.md): the tools an\n * agent needs on the common path, kept in model context up front. Everything\n * else is discovered on demand via tool-search, so the per-step schema bill\n * drops to the core only. This is a CLIENT loading configuration over the one\n * server tool set — the server always exposes all of `TOOLS`; deferral-capable\n * hosts load the core and defer the tail. Ordered to match the TOOLS array.\n */\nexport const HOT_TOOLS = ['orient', 'search_symbols', 'query_graph', 'get_node'] as const;\n\n/** Tools deferred until a task discovers them (everything not in the hot core). */\nexport function deferredToolNames(): string[] {\n const hot = new Set<string>(HOT_TOOLS);\n return TOOLS.map((t) => t.name).filter((n) => !hot.has(n));\n}\n\n/**\n * The Anthropic `mcp_toolset` deferral block for embedding `vg serve` in an\n * agent built on the Claude API: the hot core stays loaded, the rest defer and\n * are found via tool-search. Real, measured lever on hosts that support\n * `defer_loading` (~350–450 schema tokens/step vs 1,881 for the full set);\n * hosts that don't support it simply serve the whole optimized set. The server\n * is unchanged either way — one tool set, no modes.\n */\nexport function navigationToolsetConfig(serverName = 'vibgrate'): Record<string, unknown> {\n return {\n type: 'mcp_toolset',\n mcp_server_name: serverName,\n default_config: { defer_loading: true },\n configs: Object.fromEntries(HOT_TOOLS.map((n) => [n, { defer_loading: false }])),\n };\n}\n","/**\n * Shared, deterministic content for `vg install`: the skill body and the advisory\n * nudge. Posture is deliberately lighter-touch than Graphify — the nudge\n * *suggests* the graph as the faster path, never asserts \"MANDATORY\"\n * (VG-ASSISTANT-INSTALL §1). On small repos we say searching is fine.\n */\n\nexport const SKILL_MARKER = 'vg-graph-skill';\nexport const NUDGE_BEGIN = '<!-- vg:begin -->';\nexport const NUDGE_END = '<!-- vg:end -->';\n\n/**\n * Version of the generated instruction content (skill + nudge). Bump on ANY\n * wording/structure change to those templates: files written by `vg install`\n * carry this number in an HTML-comment marker, and `vg` builds auto-refresh\n * installed copies whose marker is older (see registry.ts\n * refreshInstalledInstructions) — so evolved instructions reach existing\n * repos the first time a new CLI version builds there.\n *\n * History: v1 = the unversioned originals (detected by their headings);\n * v2 = versioned markers + the strong MCP-first recommendation.\n */\nexport const INSTALL_CONTENT_VERSION = 2;\n\nconst VERSION_MARKER_RE = /<!--\\s*vg:v(\\d+)\\b[^>]*-->/;\n\n/** The marker line embedded in every generated instruction file. */\nexport function versionMarker(): string {\n return `<!-- vg:v${INSTALL_CONTENT_VERSION} · managed by \\`vg install\\` — auto-refreshed when these instructions evolve; remove this line to opt out -->`;\n}\n\n/**\n * The content version a previously-written instruction file carries, or null\n * when it has no marker (pre-versioning installs, or user-authored files).\n */\nexport function installedContentVersion(text: string): number | null {\n const m = VERSION_MARKER_RE.exec(text);\n return m ? Number(m[1]) : null;\n}\n\n/**\n * The `--client` value the skill/nudge tells the assistant to pass to `vg` so its\n * CLI calls are attributed. `vg install <assistant>` passes the assistant id\n * (e.g. `claude`, `cursor`); the canonical reference copy uses a placeholder.\n */\nfunction clientFlag(client?: string): string {\n return client ? `--client=${client}` : '--client=<your-ai>';\n}\n\nexport function skillMarkdown(client?: string): string {\n const cf = clientFlag(client);\n return `---\nname: vg\ndescription: Query the local code graph (vg) for structure, impact, and navigation instead of grepping/reading many files.\n---\n\n${versionMarker()}\n\n# vg — the code map\n\nThis repo has a deterministic code graph built by \\`vg\\`. Prefer it over reading or\ngrepping many files — it is smaller, more relevant context, and free.\n\n## Use the MCP tools — not the CLI\n\nWhen the \\`vg\\` MCP server is registered (it is after \\`vg install\\`), **always call\nits read-only tools instead of shelling out to the CLI.** The server keeps the\nmap parsed, the relation index warm, and the embedding model loaded across\ncalls, so an MCP call answers in milliseconds — while every CLI invocation pays\nNode startup plus a fresh map parse, hundreds of times more. Tools:\n\\`query_graph\\`, \\`get_node\\`, \\`impact_of\\`, \\`find_path\\`, \\`list_hubs\\`, \\`list_areas\\`,\n\\`get_graph_summary\\`, \\`search_symbols\\`. They are side-effect-free and\nauto-approvable, and the server records which client is calling automatically.\nReach for the CLI only when the MCP server is genuinely unavailable — never as\nthe first resort.\n\n## CLI fallback — only when the MCP server is unavailable\n\nIf (and only if) no \\`vg\\` MCP server is available, use the CLI — and **always\npass \\`${cf}\\`** so your calls are counted (that's how the CLI-vs-MCP split is\nmeasured and the tools improved):\n\n- **Understand code:** \\`vg \"<question>\" ${cf}\\` — a budget-bounded, fact-annotated context block.\n- **Find a symbol:** \\`vg show <name> ${cf}\\` — what it is, what it calls, what calls it.\n- **Before changing something:** \\`vg impact <name> ${cf}\\` — what breaks if you change it.\n- **Navigate:** \\`vg path <A> <B> ${cf}\\`, \\`vg tree <name> ${cf}\\`.\n\n## Dependencies & library docs\n\n- **Upgrade drift:** \\`vg drift\\` lists what is outdated across dependencies\n (offline; \\`--online\\` for currency). \\`vg scan\\` scores upgrade drift and\n \\`vg report\\` renders it (text | json | sarif | md).\n- **Version-correct docs:** \\`vg lib <name>\\` returns drift-annotated, version-\n specific usage docs for a library — inject these instead of guessing an API.\n\n### Library-docs discipline\n\nWhen a task needs a library's API, use the docs tools before web search or\ntraining-data recall — they are official content matched to the version **this\nproject has installed**, and they win when the two conflict.\n\n- **Workflow:** \\`resolve_library\\` once per library, then \\`library_docs\\` with the\n returned \\`targetId\\` and a focused query (good: \"zod refine custom error\n message\"; bad: \"zod\"). Never guess a targetId.\n- **Budget:** at most **3 docs calls per task**. If 2 \\`library_docs\\` calls have\n not surfaced the section you need, read the package source under\n \\`node_modules\\` instead of searching again.\n- **Skip the docs tools** for language built-ins, stable well-known syntax, or\n an API already shown in the current context — they add nothing there.\n\n## Keep it fresh\n\nThe map keeps itself fresh: \\`vg ask\\` and the MCP tools detect changed files\nand rebuild it incrementally before answering — you can edit code and query\nimmediately. Running \\`vg\\` after a large pull still warms everything in one go.\nThe map lives at \\`.vibgrate/graph.json\\` and is deterministic (byte-identical\nacross machines).\n`;\n}\n\nexport function nudgeMarkdown(smallRepo: boolean, client?: string): string {\n const cf = clientFlag(client);\n if (smallRepo) {\n return `${NUDGE_BEGIN}\n${versionMarker()}\n## Code navigation (vg)\n\nThis repo is small enough that searching files directly is fine. Still, before a\nchange, the \\`vg\\` graph shows what breaks: use the \\`vg\\` MCP tools when the server\nis registered (\\`impact_of\\`, \\`query_graph\\` — the warm server answers far faster\nthan spawning the CLI). Only without the server, fall back to the CLI and pass\n\\`${cf}\\` so the call is counted: \\`vg impact <name> ${cf}\\`,\n\\`vg \"<question>\" ${cf}\\`.\n${NUDGE_END}`;\n }\n return `${NUDGE_BEGIN}\n${versionMarker()}\n## Code navigation (vg) — use the MCP tools first\n\nA deterministic code graph is available. It is usually the faster, cheaper path\nthan reading or grepping many files. **When the \\`vg\\` MCP server is registered,\nalways use its tools** (\\`query_graph\\`, \\`get_node\\`, \\`impact_of\\`,\n\\`search_symbols\\`, …) — the map, indexes, and embedding model stay warm across\ncalls, so they answer in milliseconds, while every CLI invocation pays Node\nstartup plus a fresh map parse. Fall back to the CLI only when the server is\nunavailable, and then pass \\`${cf}\\` so the call is counted:\n\n- \\`vg \"<question>\" ${cf}\\` — a compact, fact-annotated context block for a question.\n- \\`vg show <name> ${cf}\\` — what a symbol is, its callers and callees.\n- \\`vg impact <name> ${cf}\\` — what breaks if you change it.\n\nThis is advisory, not mandatory — remove it with \\`vg uninstall\\` (or delete this\nblock).\n${NUDGE_END}`;\n}\n\n/** The MCP server entry registered for local stdio use. */\nexport function mcpServerEntry(launch: ServeLaunch = { command: 'vg', args: ['serve'] }): {\n command: string;\n args: string[];\n} {\n return { command: launch.command, args: launch.args };\n}\n\nexport interface ServeLaunch {\n command: string;\n args: string[];\n /** Human-readable explanation when the launch is not the plain `vg serve`. */\n note?: string;\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport {\n skillMarkdown,\n nudgeMarkdown,\n mcpServerEntry,\n installedContentVersion,\n INSTALL_CONTENT_VERSION,\n NUDGE_BEGIN,\n NUDGE_END,\n type ServeLaunch,\n} from './content.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { ensureVibgrateGitignore } from '../engine/artifacts.js';\nimport { whichOnPath, isInstalledOwnBinary } from '../util/cli-invocation.js';\nimport { navigationToolsetConfig, HOT_TOOLS, deferredToolNames } from '../mcp/tools.js';\n\n/**\n * Per-assistant install registry (a focused subset of VG-ASSISTANT-INSTALL §2;\n * the remaining 20+ assistants are added in Phase 3). All paths are repo-local\n * (the team-shareable, safe default); writes are idempotent.\n */\n\nexport interface McpTarget {\n file: string; // project-relative\n key: 'mcpServers' | 'servers';\n vscode?: boolean; // VS Code uses { servers: { vg: { type:'stdio', ... } } }\n}\nexport interface NudgeTarget {\n file: string;\n kind: 'block' | 'file';\n}\nexport interface Assistant {\n id: string;\n label: string;\n skill?: string; // project-relative SKILL.md path\n mcp?: McpTarget;\n nudge?: NudgeTarget;\n /**\n * Signs this assistant is in use, checked by `detectAssistants`:\n * `markers` are project-relative paths, `homeMarkers` are relative to the\n * user's home folder, `bin` are executables looked up on PATH. Detection is\n * best-effort presence-checking only — nothing is read or executed.\n */\n markers?: string[];\n homeMarkers?: string[];\n bin?: string[];\n}\n\nexport const ASSISTANTS: Assistant[] = [\n {\n id: 'claude',\n label: 'Claude Code',\n skill: '.claude/skills/vg/SKILL.md',\n mcp: { file: '.mcp.json', key: 'mcpServers' },\n nudge: { file: 'CLAUDE.md', kind: 'block' },\n markers: ['CLAUDE.md', '.claude'],\n homeMarkers: ['.claude', '.claude.json'],\n bin: ['claude'],\n },\n {\n id: 'cursor',\n label: 'Cursor',\n mcp: { file: '.cursor/mcp.json', key: 'mcpServers' },\n nudge: { file: '.cursor/rules/vg.mdc', kind: 'file' },\n markers: ['.cursor', '.cursorrules'],\n homeMarkers: ['.cursor'],\n bin: ['cursor-agent'],\n },\n {\n id: 'windsurf',\n label: 'Windsurf',\n mcp: { file: '.windsurf/mcp.json', key: 'mcpServers' },\n nudge: { file: '.windsurf/rules/vg.md', kind: 'file' },\n markers: ['.windsurf', '.windsurfrules'],\n homeMarkers: ['.codeium/windsurf'],\n },\n {\n id: 'vscode',\n label: 'VS Code (Copilot Chat)',\n mcp: { file: '.vscode/mcp.json', key: 'servers', vscode: true },\n nudge: { file: '.github/copilot-instructions.md', kind: 'block' },\n markers: ['.github/copilot-instructions.md'],\n },\n {\n id: 'codex',\n label: 'Codex',\n skill: '.codex/skills/vg/SKILL.md',\n nudge: { file: 'AGENTS.md', kind: 'block' },\n markers: ['.codex'],\n homeMarkers: ['.codex'],\n bin: ['codex'],\n },\n {\n id: 'gemini',\n label: 'Gemini CLI',\n skill: '.gemini/skills/vg/SKILL.md',\n nudge: { file: 'GEMINI.md', kind: 'block' },\n markers: ['GEMINI.md', '.gemini'],\n homeMarkers: ['.gemini'],\n bin: ['gemini'],\n },\n // Skill + advisory AGENTS.md nudge (the broad-reach common denominator). MCP\n // registration for these hosts is host-specific and added as their formats\n // stabilise; the skill + nudge work today.\n { id: 'grok', label: 'Grok CLI', skill: '.grok/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.grok', 'GROK.md'], homeMarkers: ['.grok'], bin: ['grok'] },\n { id: 'opencode', label: 'OpenCode', skill: '.opencode/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.opencode', 'opencode.json'], homeMarkers: ['.config/opencode'], bin: ['opencode'] },\n { id: 'kilo', label: 'Kilo Code', skill: '.kilo/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.kilo', '.kilocode'], homeMarkers: ['.kilocode'] },\n { id: 'aider', label: 'Aider', skill: '.aider/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.aider', '.aider.conf.yml'], homeMarkers: ['.aider.conf.yml'], bin: ['aider'] },\n { id: 'factory', label: 'Factory Droid', skill: '.factory/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.factory'], homeMarkers: ['.factory'], bin: ['droid'] },\n { id: 'trae', label: 'Trae', skill: '.trae/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.trae'], homeMarkers: ['.trae'] },\n { id: 'kiro', label: 'Kiro', skill: '.kiro/skills/vg/SKILL.md', nudge: { file: '.kiro/steering/vg.md', kind: 'file' }, markers: ['.kiro'], homeMarkers: ['.kiro'] },\n { id: 'amp', label: 'Amp', skill: '.agents/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, homeMarkers: ['.config/amp'], bin: ['amp'] },\n { id: 'kimi', label: 'Kimi Code', skill: '.kimi/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.kimi'], homeMarkers: ['.kimi'] },\n { id: 'codebuddy', label: 'CodeBuddy', skill: '.codebuddy/skills/vg/SKILL.md', nudge: { file: 'CODEBUDDY.md', kind: 'block' }, markers: ['CODEBUDDY.md', '.codebuddy'], homeMarkers: ['.codebuddy'] },\n { id: 'copilot-cli', label: 'GitHub Copilot CLI', skill: '.copilot/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.copilot'], homeMarkers: ['.copilot'], bin: ['copilot'] },\n { id: 'pi', label: 'Pi', skill: '.pi/agent/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.pi'], homeMarkers: ['.pi'] },\n { id: 'devin', label: 'Devin CLI', skill: '.devin/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.devin'], homeMarkers: ['.devin'] },\n { id: 'hermes', label: 'Hermes', skill: '.hermes/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.hermes'], homeMarkers: ['.hermes'] },\n { id: 'openclaw', label: 'OpenClaw', skill: '.openclaw/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['.openclaw'], homeMarkers: ['.openclaw'], bin: ['openclaw'] },\n { id: 'agents', label: 'Agent-Skills (generic)', skill: '.agents/skills/vg/SKILL.md', nudge: { file: 'AGENTS.md', kind: 'block' }, markers: ['AGENTS.md', '.agents'] },\n];\n\nexport function assistantById(id: string): Assistant | undefined {\n return ASSISTANTS.find((a) => a.id === id);\n}\n\n// --- detection ---\n\nexport interface DetectedAssistant {\n assistant: Assistant;\n /** Where the sign was found — in the repo, in the user's home folder, or on PATH. */\n via: 'repo' | 'home' | 'path';\n /** The specific marker path or executable name that matched. */\n marker: string;\n}\n\nexport interface DetectOptions {\n /** Home folder override (tests). Defaults to `os.homedir()`. */\n home?: string;\n /** PATH lookup override (tests). Defaults to `whichOnPath`. */\n which?: (cmd: string) => string | null;\n}\n\n/**\n * Best-effort detection of which AI assistants are in use — by their footprint\n * in the repo (rules files, config dirs), their per-user config in the home\n * folder, or their CLI on PATH. Pure presence checks: nothing is read,\n * parsed, or executed, and a miss is always safe (it only means \"not\n * auto-selected\"). First match per assistant wins, repo before home before\n * PATH, so the reported marker is the most local evidence.\n */\nexport function detectAssistants(root: string, opts: DetectOptions = {}): DetectedAssistant[] {\n const home = opts.home ?? os.homedir();\n const which = opts.which ?? whichOnPath;\n const found: DetectedAssistant[] = [];\n for (const assistant of ASSISTANTS) {\n const repoHit = (assistant.markers ?? []).find((m) => fs.existsSync(path.join(root, m)));\n if (repoHit) {\n found.push({ assistant, via: 'repo', marker: repoHit });\n continue;\n }\n const homeHit = (assistant.homeMarkers ?? []).find((m) => fs.existsSync(path.join(home, m)));\n if (homeHit) {\n found.push({ assistant, via: 'home', marker: homeHit });\n continue;\n }\n const binHit = (assistant.bin ?? []).find((b) => which(b) !== null);\n if (binHit) found.push({ assistant, via: 'path', marker: binHit });\n }\n return found;\n}\n\nexport interface InstallOptions {\n root: string;\n hook?: boolean; // write the advisory nudge (default true)\n smallRepo: boolean;\n /** Resolved MCP launch command; defaults to detectServeLaunch(). */\n launch?: ServeLaunch;\n}\n\nexport interface InstallAction {\n wrote: string[];\n skipped: string[];\n /** Explanation when the MCP entry is not the plain `vg serve` (e.g. PATH fallback). */\n note?: string;\n}\n\n/**\n * Resolve how the assistant host should launch the MCP server. `command: \"vg\"`\n * only works when `vg` on PATH is a *persistent install* of this CLI — a user\n * who ran via npx (whose `vg` is a throwaway npx-cache binary that disappears\n * after the run), or whose `vg` belongs to another tool (see\n * scripts/postinstall.mjs), would get a server that silently fails to start or,\n * worse, launches the wrong binary. Detection is best-effort and never throws;\n * the fallbacks keep the entry working: installed `vg` → installed `vibgrate` →\n * `npx -y -p @vibgrate/cli vg`.\n */\nexport function detectServeLaunch(which: (cmd: string) => string | null = whichOnPath): ServeLaunch {\n const vg = which('vg');\n if (vg && isInstalledOwnBinary(vg)) return { command: 'vg', args: ['serve'] };\n const vibgrate = which('vibgrate');\n if (vibgrate && isInstalledOwnBinary(vibgrate)) {\n return {\n command: 'vibgrate',\n args: ['serve'],\n note: vg\n ? '`vg` on PATH belongs to another tool — registered the identical `vibgrate serve` instead'\n : '`vg` is not on PATH — registered the identical `vibgrate serve` instead',\n };\n }\n return {\n command: 'npx',\n args: ['-y', '-p', '@vibgrate/cli', 'vg', 'serve'],\n note: 'vg is not installed on PATH — registered an npx launcher. Install globally (`npm i -g @vibgrate/cli`) and rerun `vg install` for a faster startup.',\n };\n}\n\nexport function installAssistant(a: Assistant, opts: InstallOptions): InstallAction {\n const wrote: string[] = [];\n const skipped: string[] = [];\n let note: string | undefined;\n\n if (a.skill) {\n // Pass the assistant id as the --client value so the installed skill tells\n // this AI to identify itself on CLI calls (the MCP path detects it itself).\n writeFileEnsured(path.join(opts.root, a.skill), skillMarkdown(a.id));\n wrote.push(a.skill);\n }\n if (a.mcp) {\n const launch = opts.launch ?? detectServeLaunch();\n upsertMcp(path.join(opts.root, a.mcp.file), a.mcp, launch);\n wrote.push(a.mcp.file);\n note = launch.note;\n } else {\n skipped.push('mcp (host-specific setup)');\n }\n if (a.nudge && opts.hook !== false) {\n writeNudge(path.join(opts.root, a.nudge.file), a.nudge, opts.smallRepo, a.id);\n wrote.push(a.nudge.file);\n } else if (a.nudge) {\n skipped.push('nudge (--no-hook)');\n }\n\n return { wrote, skipped, note };\n}\n\nexport function uninstallAssistant(a: Assistant, root: string, purge: boolean): string[] {\n const removed: string[] = [];\n if (a.mcp) {\n const file = path.join(root, a.mcp.file);\n if (removeMcp(file, a.mcp)) removed.push(a.mcp.file);\n }\n if (a.nudge) {\n const file = path.join(root, a.nudge.file);\n if (a.nudge.kind === 'block') {\n if (removeBlock(file)) removed.push(a.nudge.file);\n } else if (fs.existsSync(file)) {\n fs.rmSync(file);\n removed.push(a.nudge.file);\n }\n }\n if (purge && a.skill) {\n const file = path.join(root, a.skill);\n if (fs.existsSync(file)) {\n fs.rmSync(file);\n removed.push(a.skill);\n }\n }\n return removed;\n}\n\n// --- writers ---\n\nfunction writeFileEnsured(file: string, content: string): void {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, content);\n}\n\n/**\n * Write the deferred-loading navigation config once per project (plan P3,\n * VG-NAVIGATION-PROFILE.md). `vg serve` always exposes the one optimized tool\n * set; this file is the CLIENT loading configuration for agents built on the\n * Claude API that support `defer_loading` + tool-search — it keeps the hot\n * navigation core in context and defers the rest, cutting the per-step schema\n * bill to ~350–450 tokens (vs ~1,881 for the full set). Hosts that don't\n * support deferral ignore it and serve the whole optimized set. Returns the\n * repo-relative path written.\n */\nexport function writeNavigationConfig(root: string): string {\n // `vg install` may be the first thing to create `.vibgrate/` — make sure the\n // default ignore file lands with it so the install never dirties the branch.\n ensureVibgrateGitignore(root);\n const rel = path.join('.vibgrate', 'mcp-navigation.json');\n const doc = {\n _readme:\n 'Deferred-loading config for agents embedding `vg serve` via the Claude API ' +\n '(defer_loading + tool-search). The hot navigation core stays in context; the rest ' +\n 'load on demand — ~350-450 schema tokens/step vs ~1,881 for the full set. Hosts without ' +\n 'defer_loading ignore this and serve the whole (already optimized) tool set. See ' +\n 'docs/graph/VG-NAVIGATION-PROFILE.md.',\n hot_core: [...HOT_TOOLS],\n deferred: deferredToolNames(),\n toolset: navigationToolsetConfig(),\n };\n writeFileEnsured(path.join(root, rel), `${JSON.stringify(doc, null, 2)}\\n`);\n return rel;\n}\n\nfunction upsertMcp(file: string, target: McpTarget, launch: ServeLaunch): void {\n const config = readJson(file);\n const entry = mcpServerEntry(launch);\n const value = target.vscode ? { type: 'stdio', ...entry } : entry;\n const bag = (config[target.key] && typeof config[target.key] === 'object'\n ? config[target.key]\n : {}) as Record<string, unknown>;\n bag.vg = value;\n config[target.key] = bag;\n writeFileEnsured(file, `${JSON.stringify(config, null, 2)}\\n`);\n}\n\nfunction removeMcp(file: string, target: McpTarget): boolean {\n if (!fs.existsSync(file)) return false;\n const config = readJson(file);\n const bag = config[target.key] as Record<string, unknown> | undefined;\n if (!bag || !(bag.vg !== undefined)) return false;\n delete bag.vg;\n writeFileEnsured(file, `${JSON.stringify(config, null, 2)}\\n`);\n return true;\n}\n\n/**\n * Below this many mapped files the nudge honestly says searching is fine.\n * Shared by `vg install` and the post-build instruction refresh so both write\n * the same variant.\n */\nexport const SMALL_REPO_FILES = 150;\n\n/** One instruction file brought up to the current content version. */\nexport interface RefreshedInstruction {\n /** Repo-relative path of the refreshed file. */\n file: string;\n /** The version it carried (0 = pre-versioning legacy content). */\n from: number;\n to: number;\n}\n\n/**\n * Bring previously-installed assistant instructions up to the current content\n * version (INSTALL_CONTENT_VERSION). Called after every successful `vg` build,\n * so evolved instructions reach existing repos the first time a new CLI\n * version builds there — no re-run of `vg install` needed.\n *\n * Ownership rules — this must never clobber user-authored content:\n * - a file with a `vg:v<N>` marker is ours; refreshed when N is older.\n * Removing the marker line opts the file out permanently.\n * - a marker-less file at a known install path is refreshed ONLY when it\n * still carries the generated headings (legacy pre-versioning copies),\n * and treated as version 0.\n * - nudge blocks refresh only the vg:begin…vg:end region; the rest of the\n * host file (CLAUDE.md, AGENTS.md, …) is untouched.\n */\nexport function refreshInstalledInstructions(root: string, smallRepo: boolean): RefreshedInstruction[] {\n const out: RefreshedInstruction[] = [];\n const staleVersion = (text: string, legacySignature: string): number | null => {\n const v = installedContentVersion(text);\n if (v !== null) return v < INSTALL_CONTENT_VERSION ? v : null;\n return text.includes(legacySignature) ? 0 : null; // marker-less: legacy ours, or not ours at all\n };\n\n for (const a of ASSISTANTS) {\n if (a.skill) {\n const file = path.join(root, a.skill);\n if (fs.existsSync(file)) {\n const text = readTextSafe(file);\n const from = text === null ? null : staleVersion(text, '# vg — the code map');\n if (from !== null) {\n writeFileEnsured(file, skillMarkdown(a.id));\n out.push({ file: a.skill, from, to: INSTALL_CONTENT_VERSION });\n }\n }\n }\n if (a.nudge) {\n const file = path.join(root, a.nudge.file);\n if (!fs.existsSync(file)) continue;\n const text = readTextSafe(file);\n if (text === null) continue;\n if (a.nudge.kind === 'block') {\n const block = new RegExp(`${escapeRe(NUDGE_BEGIN)}[\\\\s\\\\S]*?${escapeRe(NUDGE_END)}`).exec(text);\n if (!block) continue; // no vg block in this host file — nothing of ours to refresh\n const from = staleVersion(block[0], '## Code navigation (vg)');\n if (from !== null) {\n writeNudge(file, a.nudge, smallRepo, a.id);\n out.push({ file: a.nudge.file, from, to: INSTALL_CONTENT_VERSION });\n }\n } else {\n const from = staleVersion(text, '## Code navigation (vg)');\n if (from !== null) {\n writeNudge(file, a.nudge, smallRepo, a.id);\n out.push({ file: a.nudge.file, from, to: INSTALL_CONTENT_VERSION });\n }\n }\n }\n }\n return out;\n}\n\nfunction readTextSafe(file: string): string | null {\n try {\n return fs.readFileSync(file, 'utf8');\n } catch {\n return null; // unreadable — leave it alone\n }\n}\n\nfunction writeNudge(file: string, target: NudgeTarget, smallRepo: boolean, client?: string): void {\n if (target.kind === 'file') {\n // Dedicated rule file owned by vg (Cursor .mdc needs frontmatter).\n const body = file.endsWith('.mdc')\n ? `---\\ndescription: vg code graph\\nalwaysApply: true\\n---\\n${stripMarkers(nudgeMarkdown(smallRepo, client))}`\n : stripMarkers(nudgeMarkdown(smallRepo, client));\n writeFileEnsured(file, `${body}\\n`);\n return;\n }\n upsertBlock(file, nudgeMarkdown(smallRepo, client));\n}\n\nfunction upsertBlock(file: string, block: string): void {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n let existing = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n const re = new RegExp(`${escapeRe(NUDGE_BEGIN)}[\\\\s\\\\S]*?${escapeRe(NUDGE_END)}`);\n if (re.test(existing)) existing = existing.replace(re, block);\n else existing = existing.length ? `${existing.replace(/\\s*$/, '')}\\n\\n${block}\\n` : `${block}\\n`;\n fs.writeFileSync(file, existing);\n}\n\nfunction removeBlock(file: string): boolean {\n if (!fs.existsSync(file)) return false;\n const existing = fs.readFileSync(file, 'utf8');\n const re = new RegExp(`\\\\n*${escapeRe(NUDGE_BEGIN)}[\\\\s\\\\S]*?${escapeRe(NUDGE_END)}\\\\n*`);\n if (!re.test(existing)) return false;\n fs.writeFileSync(file, existing.replace(re, '\\n'));\n return true;\n}\n\n/**\n * Read a JSON config we are about to merge into. A *missing* file is an empty\n * config; a *malformed* file must abort — silently treating it as empty would\n * rewrite the file and destroy the user's other MCP server entries.\n */\nfunction readJson(file: string): Record<string, unknown> {\n if (!fs.existsSync(file)) return {};\n try {\n const parsed = JSON.parse(fs.readFileSync(file, 'utf8')) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n throw new Error('not a JSON object');\n } catch {\n throw new CliError(\n `${file} exists but is not valid JSON — fix or remove it, then rerun. Refusing to overwrite it (that would lose your existing entries).`,\n ExitCode.ERROR,\n );\n }\n}\n\nfunction stripMarkers(s: string): string {\n return s.replace(NUDGE_BEGIN, '').replace(NUDGE_END, '').trim();\n}\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { buildGraph } from './build.js';\nimport { probeFreshness, writeSnapshot, hasDrift, type Drift } from './freshness.js';\nimport { writeArtifacts, vibgrateDir } from './artifacts.js';\nimport { acquireLock, releaseLock } from './lock.js';\nimport { cacheDir } from './cache.js';\nimport type { ClusterMode } from './analyze.js';\n\n/**\n * Auto-refresh: bring the code map back in sync with the working tree when the\n * freshness probe says it drifted. The rebuild is the ordinary incremental\n * `buildGraph` (warm parse cache → only changed files re-parse), replaying the\n * scope recorded at the last explicit build, guarded by a cross-process lock\n * so a serving MCP process and a foreground command never write at once.\n *\n * Two properties keep this safe to run implicitly:\n * - **No git churn**: if the rebuilt corpusHash equals the snapshot's (e.g. a\n * drift that reverted itself), `graph.json` is left untouched — the artifact\n * stays byte-identical.\n * - **No surprise artifacts**: `GRAPH_REPORT.md`/`graph.html` are rewritten\n * only if they already exist; a refresh never adds files a user's explicit\n * build chose not to produce.\n */\n\nexport interface RefreshOptions {\n /** Force single-threaded parsing (tests / constrained hosts). */\n inline?: boolean;\n /** Worker count for the parse pool. */\n jobs?: number;\n}\n\nexport type RefreshOutcome =\n /** Map already matches the working tree. */\n | { status: 'fresh' }\n /** No freshness snapshot — no build ever ran here, so scope is unknown. */\n | { status: 'no-snapshot' }\n /** Another vg process is rebuilding right now; its write will land shortly. */\n | { status: 'locked' }\n /** Rebuilt. `wrote` is false when the corpus turned out unchanged. */\n | { status: 'refreshed'; drift: Drift; ms: number; reparsed: number; totalFiles: number; wrote: boolean }\n | { status: 'error'; message: string };\n\n/** A refresh stuck longer than this is presumed crashed and its lock reclaimed. */\nconst REFRESH_LOCK_STALE_MS = 10 * 60 * 1000;\n\nfunction refreshLockPath(root: string): string {\n return path.join(cacheDir(root), 'refresh.lock');\n}\n\n/**\n * Probe, and rebuild incrementally if the tree drifted from the map.\n * Silent (no output) — callers own the messaging for their surface.\n */\nexport async function refreshIfStale(root: string, opts: RefreshOptions = {}): Promise<RefreshOutcome> {\n const probe = probeFreshness(root);\n if (!probe) return { status: 'no-snapshot' };\n if (!hasDrift(probe.drift)) return { status: 'fresh' };\n\n const lock = refreshLockPath(root);\n if (!acquireLock(lock, REFRESH_LOCK_STALE_MS)) return { status: 'locked' };\n\n const start = process.hrtime.bigint();\n try {\n const { scope } = probe;\n const result = await buildGraph({\n root,\n only: scope.only,\n exclude: scope.exclude,\n paths: scope.paths,\n deep: scope.deep,\n noGround: scope.noGround,\n scip: scope.scip,\n noScip: scope.noScip,\n noTsc: scope.noTsc,\n cluster: scope.cluster as ClusterMode | undefined,\n grammarsDir: scope.grammarsDir,\n inline: opts.inline,\n jobs: opts.jobs,\n });\n\n const wrote = result.graph.provenance.corpusHash !== probe.corpusHash;\n if (wrote) {\n const dir = vibgrateDir(root);\n writeArtifacts(result.graph, {\n root,\n report: fs.existsSync(path.join(dir, 'GRAPH_REPORT.md')),\n html: fs.existsSync(path.join(dir, 'graph.html')),\n });\n }\n writeSnapshot(root, result.graph.provenance.corpusHash, result.fileStats, scope);\n\n const ms = Number((process.hrtime.bigint() - start) / 1000000n);\n return {\n status: 'refreshed',\n drift: probe.drift,\n ms,\n reparsed: result.reparsed,\n totalFiles: result.totalFiles,\n wrote,\n };\n } catch (err) {\n return { status: 'error', message: (err as Error).message };\n } finally {\n releaseLock(lock);\n }\n}\n"]}