@vibgrate/cli 2026.721.2 → 2026.721.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/baseline-37G4TINM.js +6 -0
- package/dist/{baseline-KK7ZLRZB.js.map → baseline-37G4TINM.js.map} +1 -1
- package/dist/{chunk-MUMBLIDO.js → chunk-5PLKADD6.js} +3 -3
- package/dist/{chunk-MUMBLIDO.js.map → chunk-5PLKADD6.js.map} +1 -1
- package/dist/{chunk-3DPZQS2Q.js → chunk-ELUFCQDR.js} +123 -20
- package/dist/chunk-ELUFCQDR.js.map +1 -0
- package/dist/{chunk-JWBS5GS6.js → chunk-IKJBELUV.js} +92 -7
- package/dist/chunk-IKJBELUV.js.map +1 -0
- package/dist/{chunk-NHLSAZ6N.js → chunk-JLRF5TFA.js} +3 -3
- package/dist/{chunk-NHLSAZ6N.js.map → chunk-JLRF5TFA.js.map} +1 -1
- package/dist/cli.js +5 -5
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +1 -1
- package/dist/{types-BgNa-FZQ.d.ts → types-Jl6RJ175.d.ts} +8 -0
- package/package.json +3 -2
- package/dist/baseline-KK7ZLRZB.js +0 -6
- package/dist/chunk-3DPZQS2Q.js.map +0 -1
- package/dist/chunk-JWBS5GS6.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/engine/serialize.ts","../src/schema.ts","../src/engine/pool.ts","../src/engine/resolve.ts","../src/engine/ts-resolver.ts","../src/engine/cache.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/lock.ts","../src/engine/embeddings.ts","../src/engine/freshness.ts","../src/engine/relations.ts","../src/engine/query.ts","../src/engine/lookup.ts","../src/engine/graph-model.ts","../src/engine/paths.ts","../src/engine/impact.ts","../src/engine/test-query.ts","../src/engine/drift.ts","../src/engine/models.ts","../src/engine/lockfile.ts","../src/engine/lib.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","../src/engine/savings.ts","../src/mcp/server.ts","../src/engine/export.ts"],"names":["fs","path","fs2","rel","walk","path2","dot","q","fs3","path3","fs4","enclosing","nodeId","fs5","path4","resolve","path5","mod","sep","unresolved","normalize","add","path6","path7","fs6","path8","fs7","cached","path9","fs8","fs9","fs10","path10","path11","os2","fs11","path12","fs12","push","round","text","Graph","path13","fs13","SKIP_DIRS","MAX_ENTRIES","fs14","path14","os3","path15","fs15","fs16","path16","os4","execFileSync","path18","fs18","path19","path20","os5","fs19","gzip","chalk","Command","path21","path22","fs20","STOPWORDS","full","chunk","CACHE_VERSION","cachePath","path23","fs21","obj","fs22","path24","os6","path25","toPosix","fs23","posix","os7","fs24","path26","path27","fs25","path28","fs26","round2","bump","path29","fs27","esc"],"mappings":"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","file":"chunk-ELUFCQDR.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","import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic serialization of `graph.json`.\n *\n * Object keys are sorted recursively and arrays are emitted in the (already\n * stable) order the engine produced them, so two runs over identical content\n * yield byte-identical output — the determinism contract (VG-CLI-SPEC §1.3).\n * Pretty-printed (2-space) and newline-terminated so the committed artifact is\n * human-diffable and plays well with the union merge driver.\n */\nexport function serializeGraph(graph: VgGraph): string {\n return `${stableStringify(graph, 2)}\\n`;\n}\n\nexport function stableStringify(value: unknown, indent = 2): string {\n return JSON.stringify(sortKeys(value), null, indent);\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(input).sort()) {\n const v = input[key];\n if (v === undefined) continue; // omit undefined for stable output\n out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\nexport function parseGraph(json: string): VgGraph {\n return JSON.parse(json) as VgGraph;\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 * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { stableStringify } from './serialize.js';\nimport type { FileParse } from './types.js';\n\n/**\n * Incremental parse cache. Maps a file's content hash to its parsed\n * symbol/edge tables, so a rebuild re-parses only files whose content actually\n * changed (VG-DEVELOPMENT-PLAN Phase 0.4). Lives under `.vibgrate/cache/` and is\n * gitignored — never part of the committed artifact.\n *\n * The cache is a pure performance optimisation: a reused FileParse is identical\n * to a freshly-parsed one (parsing is pure over content), so the graph is\n * byte-identical whether or not the cache was warm. `--no-cache` / `vg verify`\n * prove this.\n */\n\n// Bumped to /3: FileParse now carries `namespaces` (C# cross-namespace\n// resolution); a cache written before this lacks it and must be re-parsed.\nconst CACHE_VERSION = 'vg-parse-cache/3';\n\ninterface CacheFile {\n version: string;\n toolVersion: string;\n grammars: string;\n entries: Record<string, { hash: string; parse: FileParse }>;\n}\n\nexport interface ParseCache {\n get(rel: string, hash: string): FileParse | undefined;\n set(rel: string, parse: FileParse): void;\n /** Drop entries for files no longer present. */\n prune(currentRels: Set<string>): void;\n save(): void;\n}\n\nexport function cacheDir(root: string): string {\n return path.join(root, '.vibgrate', 'cache');\n}\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'parse-cache.json');\n}\n\nexport function loadCache(\n root: string,\n opts: { toolVersion: string; grammars: string; disabled?: boolean },\n): ParseCache {\n const file = cachePath(root);\n let data: CacheFile = {\n version: CACHE_VERSION,\n toolVersion: opts.toolVersion,\n grammars: opts.grammars,\n entries: {},\n };\n\n if (!opts.disabled && fs.existsSync(file)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as CacheFile;\n // Invalidate wholesale if the tool or grammars changed — those are\n // determinism inputs, so a stale parse could differ from a fresh one.\n if (\n loaded.version === CACHE_VERSION &&\n loaded.toolVersion === opts.toolVersion &&\n loaded.grammars === opts.grammars &&\n loaded.entries\n ) {\n data = loaded;\n }\n } catch {\n /* corrupt cache — start fresh */\n }\n }\n\n return {\n get(rel, hash) {\n const entry = data.entries[rel];\n return entry && entry.hash === hash ? entry.parse : undefined;\n },\n set(rel, parse) {\n data.entries[rel] = { hash: parse.hash, parse };\n },\n prune(currentRels) {\n for (const rel of Object.keys(data.entries)) {\n if (!currentRels.has(rel)) delete data.entries[rel];\n }\n },\n save() {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(file, stableStringify(data, 0));\n },\n };\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\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';\n\n/**\n * Cross-process single-writer lock (O_EXCL create), shared by the embedding\n * cache writer and the auto-refresh rebuild so two vg processes never write\n * the same repo-local artifact at once. A lock whose owning process is dead,\n * or that is older than `staleMs`, is presumed abandoned and reclaimed.\n */\n\n/** A lock older than this is presumed dead (crashed process). */\nexport const DEFAULT_LOCK_STALE_MS = 15 * 60 * 1000;\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException).code === 'EPERM'; // exists, just not ours to signal\n }\n}\n\nfunction lockIsStale(file: string, staleMs: number): boolean {\n try {\n const { pid, at } = JSON.parse(fs.readFileSync(file, 'utf8')) as { pid?: number; at?: number };\n if (typeof at === 'number' && Date.now() - at > staleMs) return true;\n if (typeof pid === 'number' && !isProcessAlive(pid)) return true;\n return false;\n } catch {\n return true; // unreadable/corrupt → reclaim it\n }\n}\n\n/** Take the lock (O_EXCL), reclaiming a stale/dead one. Returns success. */\nexport function acquireLock(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n const write = (): boolean => {\n try {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const fd = fs.openSync(file, 'wx');\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: Date.now() }));\n fs.closeSync(fd);\n return true;\n } catch {\n return false;\n }\n };\n if (write()) return true;\n if (lockIsStale(file, staleMs)) {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* another process may have reclaimed it */\n }\n return write();\n }\n return false;\n}\n\nexport function releaseLock(file: string): void {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* best-effort */\n }\n}\n","import * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { hashString } from './hash.js';\nimport { cacheDir } from './cache.js';\nimport { acquireLock, releaseLock } from './lock.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Local-embedding semantic search for `vg ask --semantic`/`--deep` (no API key).\n *\n * The embedding backend is an OPTIONAL, lazily-loaded dependency (`fastembed`,\n * Apache-2.0, local ONNX) so the core install stays lean and `ask` never breaks:\n * if the backend or model isn't available it degrades to (prefix-fuzzy) lexical\n * search with a clear note. Embeddings are query-time + cached under\n * `.vibgrate/cache/` (keyed by node-text hash); they are NEVER written into the\n * committed `graph.json`, so the artifact stays byte-deterministic.\n *\n * `--local` disables the model download (semantic is skipped unless already\n * cached via an injected backend), keeping the air-gapped guarantee.\n */\n\nexport interface Embedder {\n /** Stable model id (recorded with cached vectors so a model change invalidates them). */\n id: string;\n /** Embed documents → unit-or-raw vectors (cosine handles normalization). */\n embed(texts: string[]): Promise<number[][]>;\n /** Embed a single query string. */\n embedQuery(text: string): Promise<number[]>;\n}\n\n/** Why semantic fell back to lexical — for calm, specific messaging. */\nexport type EmbedUnavailable = 'not-installed' | 'no-permission' | 'download-failed' | 'init-failed';\n\nexport interface LoadEmbedderOptions {\n local?: boolean; // --local: do not download a model\n model?: string; // override the embedding model id\n noDownload?: boolean; // only load if the model is already cached (never fetch)\n showDownloadProgress?: boolean; // let fastembed print its one-time download progress\n onUnavailable?: (reason: EmbedUnavailable) => void; // called (not thrown) when it can't load\n}\n\n/** The embedding model id in effect (explicit override → default). */\nexport function resolveEmbedModel(model?: string): string {\n return model ?? 'bge-small-en-v1.5';\n}\n\n/**\n * The **central, per-user** model cache — downloaded once per machine and shared\n * across every repo/folder (devs have many repos; the ~tens-of-MB model should\n * not re-download per project). Uses the XDG standard:\n * `$XDG_CACHE_HOME/vibgrate/models` (or `~/.cache/vibgrate/models`); relocate via\n * the standard `XDG_CACHE_HOME`. NB: fastembed's own default is the relative\n * `./local_cache`, i.e. per-CWD — which we override.\n */\nexport function modelCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'models');\n}\n\n/** A machine-global marker written once the model has loaded successfully. */\nfunction modelReadyMarker(modelId: string): string {\n return path.join(modelCacheDir(), `.ready-${safe(modelId)}`);\n}\n\n/**\n * Whether the embedding model is already present on this machine (loaded at least\n * once), so it can be used with **no network**. Lets the background warm-up\n * trigger only when it won't surprise-download.\n */\nexport function isModelReady(modelId = resolveEmbedModel()): boolean {\n return fs.existsSync(modelReadyMarker(modelId));\n}\n\n/**\n * A calm, specific, actionable one-liner for why semantic isn't available right\n * now — built to reassure (lexical still works) and inform, never to alarm. No\n * stack traces, no scary words; always names the off switch and the fix.\n */\nexport function unavailableMessage(reason: EmbedUnavailable): string {\n switch (reason) {\n case 'no-permission':\n return `semantic search couldn't write its model cache at ${modelCacheDir()} — using fast lexical search instead. Relocate it with the standard XDG_CACHE_HOME, or run with --local to stay lexical quietly. (No admin/sudo is ever needed — the cache lives in your home folder.)`;\n case 'download-failed':\n return `the semantic model isn't downloaded yet and couldn't be fetched (offline?) — using fast lexical search. It'll try again next time; run with --local to keep lexical without retrying.`;\n case 'not-installed':\n return `the optional semantic backend isn't available here — using fast lexical search.`;\n case 'init-failed':\n default:\n return `the semantic model couldn't load — using fast lexical search.`;\n }\n}\n\nexport interface ModelCacheInfo {\n dir: string;\n present: boolean;\n bytes: number;\n}\n\n/** Where the shared model lives, whether it's present, and how big it is. */\nexport function modelCacheInfo(modelId = resolveEmbedModel()): ModelCacheInfo {\n const dir = modelCacheDir();\n return { dir, present: isModelReady(modelId) || fs.existsSync(dir), bytes: dirSize(dir) };\n}\n\n/** Remove the shared, re-downloadable model from the central cache. Returns bytes freed. */\nexport function clearModelCache(): number {\n const dir = modelCacheDir();\n const bytes = dirSize(dir);\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n /* best-effort */\n }\n return bytes;\n}\n\nfunction dirSize(dir: string): number {\n let total = 0;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) total += dirSize(p);\n else {\n try {\n total += fs.statSync(p).size;\n } catch {\n /* skip unreadable */\n }\n }\n }\n return total;\n}\n\nfunction isPermissionError(e: unknown): boolean {\n const code = (e as NodeJS.ErrnoException | undefined)?.code;\n return code === 'EACCES' || code === 'EPERM' || code === 'EROFS';\n}\n\n/**\n * Whether this repo already has a cached vector set for `modelId` — i.e. semantic\n * search has run here before, so the next run is fast (no first-use download/embed).\n * Lets `ask` show the one-time setup note only when it's actually warranted.\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n return fs.existsSync(path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`));\n}\n\n/**\n * Try to load the optional local embedding backend. Returns null (→ caller falls\n * back to lexical) when running `--local`, when the dependency isn't installed,\n * or when the model can't initialize.\n */\nexport async function loadEmbedder(options: LoadEmbedderOptions = {}): Promise<Embedder | null> {\n // `--local` forces the deterministic lexical floor with no model load/download\n // (air-gapped guarantee; also how tests stay offline).\n if (options.local) return null;\n const modelId = resolveEmbedModel(options.model);\n // noDownload (used by the background warm-up): never fetch — bail if not cached.\n if (options.noDownload && !isModelReady(modelId)) return null;\n const fail = (reason: EmbedUnavailable): null => {\n options.onUnavailable?.(reason);\n return null;\n };\n\n // Lazy, optional dependency (native ONNX): loaded only for `vg ask`/`embed`,\n // never by build/verify, so the graph artifact stays deterministic.\n const mod: any = await importEmbedBackend();\n if (!mod?.FlagEmbedding) return fail('not-installed');\n\n const cache = modelCacheDir(); // central, shared across all repos\n try {\n fs.mkdirSync(cache, { recursive: true });\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'init-failed');\n }\n\n try {\n // First use fetches the model. A refused connection fails fast, but a\n // black-holing proxy (common on corporate networks) would hang the first\n // `vg ask` / MCP query_graph forever — bound the wait and fall back to\n // lexical instead. Cached loads are local disk and get the same generous\n // ceiling without ever hitting it.\n const model: any = await withTimeout(\n mod.FlagEmbedding.init({\n model: mapModel(mod, modelId),\n cacheDir: cache,\n showDownloadProgress: options.showDownloadProgress ?? false,\n }) as Promise<unknown>,\n embedInitTimeoutMs(),\n 'embedding model init timed out',\n );\n // Record machine-global readiness so future builds can warm up offline.\n try {\n fs.writeFileSync(modelReadyMarker(modelId), new Date(0).toISOString());\n } catch {\n /* marker is best-effort */\n }\n return {\n id: modelId,\n async embed(texts) {\n const out: number[][] = [];\n for await (const batch of model.embed(texts, 64)) {\n for (const v of batch) out.push(Array.from(v as ArrayLike<number>));\n }\n return out;\n },\n async embedQuery(text) {\n const v = await model.queryEmbed(text);\n return Array.from(v as ArrayLike<number>);\n },\n };\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'download-failed');\n }\n}\n\n/**\n * Import the optional native backend. A host can supply it out-of-tree via\n * `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules` contains\n * `fastembed`. Editor integrations use this when their bundled engine ships\n * without the native optional dependency (the VS Code extension installs it\n * into its own storage on consent); the host dir wins over this package's own\n * dependency tree so the copy the user consented to is the one that loads.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<any> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n const mod: any = await import(pathToFileURL(req.resolve('fastembed')).href);\n // A CJS entry imported over ESM may nest its exports under `default`.\n const resolved = mod?.FlagEmbedding ? mod : mod?.default;\n if (resolved?.FlagEmbedding) return resolved;\n } catch {\n /* fall through to normal resolution */\n }\n }\n return await import('fastembed' as string).catch(() => null);\n}\n\n/** Ceiling for the one-time model fetch/init; override via VG_EMBED_TIMEOUT_MS. */\nfunction embedInitTimeoutMs(): number {\n const n = Number(process.env.VG_EMBED_TIMEOUT_MS);\n return Number.isFinite(n) && n > 0 ? n : 60_000;\n}\n\n/** Reject `promise` if it hasn't settled within `ms` (the work itself is not cancelled). */\nexport async function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), ms);\n timer.unref?.();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction mapModel(mod: any, id: string): unknown {\n const m = mod.EmbeddingModel ?? {};\n if (/bge-small/i.test(id)) return m.BGESmallENV15 ?? m.BGESmallEN ?? id;\n if (/bge-base/i.test(id)) return m.BGEBaseENV15 ?? id;\n if (/all-minilm/i.test(id)) return m.AllMiniLML6V2 ?? id;\n return id;\n}\n\n/** Path segments that carry no semantic signal — dropped from embed context. */\nconst PATH_NOISE = new Set([\n 'src', 'app', 'apps', 'lib', 'libs', 'dist', 'build', 'out', 'index', 'main',\n 'packages', 'pkg', 'test', 'tests', '__tests__', 'spec', 'node_modules', 'internal',\n 'com', 'example', 'demo', 'java', 'net', 'org', 'www',\n]);\n\n/** Meaningful path context for a node: a couple of parent dirs + the filename stem. */\nfunction pathContext(file: string): string {\n const parts = file.split('/');\n const stem = (parts.pop() ?? '').replace(/\\.[^.]+$/, '');\n const dirs = parts.filter((p) => p && !PATH_NOISE.has(p.toLowerCase()));\n return [...dirs.slice(-2), stem].filter(Boolean).join(' ');\n}\n\n/**\n * The text we embed for a node. Alongside identity + signature we add the\n * strongest available signal — the node's **doc-comment / docstring** summary —\n * plus lightweight context already on the graph (file-path words, area label), so\n * a tersely-named symbol (`Table`, `NotificationJob`) a concept query can reach.\n * Only the short, truncated doc summary is used (captured at build time); no full\n * file bodies, so the graph artifact stays deterministic.\n */\nexport function nodeEmbedText(node: GraphNode, areaLabel?: string): string {\n return [node.qualifiedName, node.kind, node.signature ?? '', node.doc ?? '', pathContext(node.file), areaLabel ?? '']\n .filter(Boolean)\n .join(' ');\n}\n\nexport function cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\ninterface EmbedCache {\n model: string;\n entries: Record<string, { hash: string; vec: number[] }>;\n}\n\n/** Reports embedding progress: how many of `total` nodes are done so far. */\nexport type EmbedProgress = (done: number, total: number) => void;\n\n/** Nodes embedded per chunk — bounds memory and gives progress granularity. */\nconst EMBED_CHUNK = 256;\n/** Min gap between incremental cache writes (ms) — caps IO on big repos. */\nconst CACHE_WRITE_INTERVAL_MS = 1500;\n\nfunction vectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/**\n * How many searchable nodes still need embedding for `modelId` — cheap (hashes\n * the embed-text, reads only the cache; never loads the model). Lets the embed\n * command / background warm-up exit instantly when nothing changed.\n */\nexport function countPending(graph: VgGraph, root: string, modelId: string): number {\n const entries = readCacheEntries(vectorCachePath(root, modelId), modelId);\n const areaLabel = new Map(graph.areas.map((a) => [a.id, a.label] as const));\n let pending = 0;\n for (const n of graph.nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const h = hashString(nodeEmbedText(n, areaLabel.get(n.area)));\n const cached = entries[n.id];\n if (!cached || cached.hash !== h) pending++;\n }\n return pending;\n}\n\nfunction readCacheEntries(file: string, modelId: string): EmbedCache['entries'] {\n if (!fs.existsSync(file)) return {};\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) return loaded.entries;\n } catch {\n /* treat as empty */\n }\n return {};\n}\n\n// Single-writer lock (shared helper — see ./lock.ts) so a foreground `ask`\n// and a background `embed` never both embed the same repo at once (which\n// would race on the cache file).\n\n/**\n * Node embeddings for the searchable (non-file/external) nodes, cache-backed:\n * only nodes whose embed-text changed are re-embedded. The first run embeds in\n * chunks, **persists the cache incrementally** (so an interrupted/timed-out run\n * resumes instead of wasting the work), and reports progress via `onProgress`.\n */\nexport async function getNodeEmbeddings(\n graph: VgGraph,\n embedder: Embedder,\n root: string,\n onProgress?: EmbedProgress,\n): Promise<Map<string, number[]>> {\n const file = vectorCachePath(root, embedder.id);\n let cache: EmbedCache = { model: embedder.id, entries: {} };\n if (fs.existsSync(file)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as EmbedCache;\n if (loaded.model === embedder.id && loaded.entries) cache = loaded;\n } catch {\n /* rebuild */\n }\n }\n\n const areaLabel = new Map(graph.areas.map((a) => [a.id, a.label] as const));\n const targets = graph.nodes.filter((n) => n.kind !== 'file' && n.kind !== 'external');\n const toEmbed: { id: string; text: string; hash: string }[] = [];\n const vectors = new Map<string, number[]>();\n for (const n of targets) {\n const text = nodeEmbedText(n, areaLabel.get(n.area));\n const h = hashString(text);\n const cached = cache.entries[n.id];\n if (cached && cached.hash === h) vectors.set(n.id, cached.vec);\n else toEmbed.push({ id: n.id, text, hash: h });\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(cache));\n fs.renameSync(tmp, file);\n } catch {\n /* cache write best-effort */\n }\n };\n\n if (toEmbed.length) {\n // Single-writer: if another process (e.g. a background warm-up) is already\n // embedding this repo, don't double-work or race the cache — return what's\n // cached so far (lexical floor still applies). It will be complete next run.\n const lock = `${file}.lock`;\n if (!acquireLock(lock)) return vectors;\n try {\n onProgress?.(0, toEmbed.length);\n let lastWrite = Date.now();\n for (let i = 0; i < toEmbed.length; i += EMBED_CHUNK) {\n const slice = toEmbed.slice(i, i + EMBED_CHUNK);\n const vecs = await embedder.embed(slice.map((t) => t.text));\n slice.forEach((t, j) => {\n const vec = vecs[j] ?? [];\n vectors.set(t.id, vec);\n cache.entries[t.id] = { hash: t.hash, vec };\n });\n onProgress?.(Math.min(i + EMBED_CHUNK, toEmbed.length), toEmbed.length);\n // Persist periodically so a crash/timeout resumes from here next run.\n if (Date.now() - lastWrite >= CACHE_WRITE_INTERVAL_MS) {\n persist();\n lastWrite = Date.now();\n }\n }\n // prune entries for nodes no longer present, then a final authoritative write\n const live = new Set(targets.map((n) => n.id));\n for (const id of Object.keys(cache.entries)) if (!live.has(id)) delete cache.entries[id];\n persist();\n } finally {\n releaseLock(lock);\n }\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\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 type { EdgeKind, GraphEdge, GraphNode, VgGraph } from '../schema.js';\n\n/** Indexes over a graph for O(1) neighbor lookups (built once per command). */\nexport class GraphIndex {\n readonly nodeById = new Map<string, GraphNode>();\n private outById = new Map<string, GraphEdge[]>();\n private inById = new Map<string, GraphEdge[]>();\n\n constructor(readonly graph: VgGraph) {\n for (const n of graph.nodes) this.nodeById.set(n.id, n);\n for (const e of graph.edges) {\n push(this.outById, e.src, e);\n push(this.inById, e.dst, e);\n }\n }\n\n out(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.outById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n in(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.inById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n node(id: string): GraphNode | undefined {\n return this.nodeById.get(id);\n }\n\n /**\n * Resolved nodes called by `id` — invocations (`call`) plus structural\n * dependency references (`references`, e.g. a constructor-injected field's\n * type), since both represent real usage a caller/impact question cares\n * about. `references` is otherwise only emitted by the precise SCIP/tsc\n * rungs and (for Java DI wiring) the heuristic rung — never a guess.\n */\n callees(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.out(id).filter(isUsageEdge), 'dst');\n }\n\n /** Resolved nodes that call or structurally reference `id`. */\n callers(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.in(id).filter(isUsageEdge), 'src');\n }\n\n private resolveTargets(edges: GraphEdge[], end: 'src' | 'dst') {\n const out: { edge: GraphEdge; node: GraphNode }[] = [];\n for (const e of edges) {\n const node = this.nodeById.get(e[end]);\n if (node) out.push({ edge: e, node });\n }\n return out;\n }\n}\n\nconst USAGE_KINDS: ReadonlySet<EdgeKind> = new Set(['call', 'references']);\nfunction isUsageEdge(e: GraphEdge): boolean {\n return USAGE_KINDS.has(e.kind);\n}\n\nfunction push(map: Map<string, GraphEdge[]>, key: string, value: GraphEdge): void {\n const list = map.get(key);\n if (list) list.push(value);\n else map.set(key, [value]);\n}\n\n/**\n * Memoized `GraphIndex`, keyed on the graph object's identity.\n *\n * The index (node-by-id + in/out adjacency) is a pure function of the graph's\n * content, and every read path rebuilds it from scratch — an O(nodes + edges)\n * pass that, on a large map, costs hundreds of milliseconds *per query*. Under\n * `vg serve` the same parsed graph object is reused across many tool calls\n * (`GraphSource` caches it by file mtime and only replaces the reference when\n * `graph.json` actually changes), so rebuilding the index on every call is pure\n * waste. Keying a `WeakMap` on that object identity builds the index once and\n * reuses it until the file is rebuilt — at which point `GraphSource` hands back a\n * *new* object, this map misses, and the stale index is collected with the old\n * graph. Correct and stale-safe by construction: a different graph is a\n * different object, so there is no cross-graph reuse and nothing to invalidate.\n *\n * `GraphIndex` is read-only (no method mutates its maps), so sharing one\n * instance across callers is safe.\n */\nconst INDEX_CACHE = new WeakMap<VgGraph, GraphIndex>();\n\nexport function indexFor(graph: VgGraph): GraphIndex {\n let idx = INDEX_CACHE.get(graph);\n if (!idx) {\n idx = new GraphIndex(graph);\n INDEX_CACHE.set(graph, idx);\n }\n return idx;\n}\n","import { indexFor, type GraphIndex } from './relations.js';\nimport { cosine, type Embedder } from './embeddings.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Deterministic retrieval for `vg ask` (VG-CLI-SPEC §3.2).\n *\n * Builds a structured, fact-annotated, budget-bounded context block for a\n * question — designed to drop straight into an assistant's context. The default\n * is deterministic lexical+structural retrieval (identifier/term matching with\n * morphological prefix-fuzzing, ranked by importance). `--semantic`/`--deep` adds\n * a hybrid local-embedding pass (`queryGraphSemantic`) that surfaces conceptually\n * related code even when no word is shared — still no API key.\n */\n\nexport interface QueryOptions {\n budget?: number; // approx token budget for the context block (default 2000)\n limit?: number; // max seed matches to expand (default 12)\n}\n\nexport interface QueryMatch {\n node: GraphNode;\n score: number;\n why: string;\n}\n\nexport interface QueryResult {\n question: string;\n matches: QueryMatch[];\n context: string;\n tokensEstimate: number;\n}\n\nconst STOPWORDS = new Set([\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'to', 'of', 'in', 'on', 'for', 'and', 'or',\n 'where', 'what', 'which', 'how', 'do', 'does', 'did', 'i', 'we', 'it', 'this', 'that', 'with',\n 'when', 'who', 'why', 'can', 'should', 'my', 'our', 'you', 'your', 'from', 'by', 'at', 'as',\n // Discovery-question scaffolding: words a caller uses to FRAME the ask\n // (\"find the code responsible for X\", \"I need to modify X, where do I\n // start?\", \"explain how X works in this codebase\") rather than to name the\n // target. Left in, these compete on equal footing with the real identifier\n // terms and can outrank it outright — e.g. \"find the code responsible for\n // deleteAsync\" let \"find\" alone drag in every FindByIdAsync/FindAll method\n // in the repo, none of them the target (VG-LOCATE-FAILURE-ANALYSIS.md).\n 'find', 'code', 'responsible', 'need', 'modify', 'me',\n 'implementation', 'explain', 'works', 'codebase', 'contains', 'file',\n]);\n\nexport function queryGraph(graph: VgGraph, question: string, options: QueryOptions = {}): QueryResult {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const terms = tokenize(question);\n const weightOf = termWeights(graph, terms);\n const index = indexFor(graph);\n\n const scored: QueryMatch[] = [];\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const { score, why } = scoreNode(node, terms, weightOf);\n if (score > 0) scored.push({ node, score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)), why });\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n\n const seeds = scored.slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget);\n\n return { question, matches: seeds, context, tokensEstimate };\n}\n\nexport interface SemanticQueryOptions extends QueryOptions {\n embedder: Embedder;\n /** Precomputed node vectors (from getNodeEmbeddings); falls back to lexical for nodes without one. */\n nodeVectors: Map<string, number[]>;\n}\n\n/**\n * Hybrid lexical + local-embedding retrieval. Blends the normalized lexical score\n * with cosine similarity to the query embedding (50/50), so a question like\n * \"where do we handle auth failures?\" can surface `verify_token` even with no\n * shared identifier. Deterministic given the same model + cached vectors;\n * embeddings live only in the cache, never in `graph.json`.\n */\nexport async function queryGraphSemantic(\n graph: VgGraph,\n question: string,\n options: SemanticQueryOptions,\n): Promise<QueryResult> {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const terms = tokenize(question);\n const weightOf = termWeights(graph, terms);\n const index = indexFor(graph);\n const queryVec = await options.embedder.embedQuery(question);\n\n // Raw lexical scores (pre-importance) for normalization.\n const lexRaw = new Map<string, number>();\n let lexMax = 0;\n const whyById = new Map<string, string>();\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const { score, why } = scoreNode(node, terms, weightOf);\n lexRaw.set(node.id, score);\n whyById.set(node.id, why);\n if (score > lexMax) lexMax = score;\n }\n\n const scored: QueryMatch[] = [];\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const lexNorm = lexMax > 0 ? (lexRaw.get(node.id) ?? 0) / lexMax : 0;\n const vec = options.nodeVectors.get(node.id);\n const sem = vec ? Math.max(0, cosine(queryVec, vec)) : 0;\n const hybrid = 0.5 * lexNorm + 0.5 * sem;\n if (hybrid <= 0) continue;\n const lexWhy = whyById.get(node.id);\n const why = lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : 'weak match');\n scored.push({ node, score: round(hybrid * (1 + IMPORTANCE_WEIGHT * node.importance)), why });\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n\n const seeds = scored.slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget);\n return { question, matches: seeds, context, tokensEstimate };\n}\n\n/**\n * Split on anything that isn't a Unicode letter/number (`\\p{L}\\p{N}`, not the\n * ASCII-only `[a-z0-9]`) so identifiers in non-Latin scripts (Japanese,\n * Cyrillic, ...) survive tokenization instead of vanishing entirely — the\n * ASCII-only split treated every character of e.g. `名前` as a separator,\n * producing zero terms and a guaranteed empty result for any question about\n * it (VG-LOCATE-FAILURE-ANALYSIS.md). Length floor is 1, not 2: a single\n * non-stopword letter/digit is still the whole identifier when that's genuinely\n * the symbol's name (adversarial fixtures deliberately use bare `f`/`x`/`h`\n * names to stress this) — STOPWORDS already screens out short function words.\n */\nfunction tokenize(q: string): string[] {\n return [\n ...new Set(\n q\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length >= 1 && !STOPWORDS.has(t)),\n ),\n ];\n}\n\nfunction scoreNode(node: GraphNode, terms: string[], weightOf: (t: string) => number = () => 1): { score: number; why: string } {\n let score = 0;\n const hits: string[] = [];\n const name = node.name.toLowerCase();\n const qn = node.qualifiedName.toLowerCase();\n const file = node.file.toLowerCase();\n // Split the ORIGINAL name on camelCase / snake_case, then lowercase the parts\n // (splitting must see the capitals, so it happens before lowercasing).\n const nameParts = identifierParts(node.name);\n for (const t of terms) {\n // Each term's contribution is weighted by its specificity (IDF over symbol\n // names): a match on a distinctive term (\"toComparable\", \"layoutFor\") counts\n // for more than a match on a term shared by hundreds of symbols (\"code\",\n // \"get\", \"run\"). Without this, an incidental exact-name hit on a common word\n // in a natural-language question outranked the conceptually-correct symbol,\n // and importance weighting amplified the wrong hit (VG-NAVIGATION trace).\n const w = weightOf(t);\n if (name === t) {\n score += 10 * w;\n hits.push(t);\n } else if (nameParts.has(t)) {\n score += 6 * w;\n hits.push(t);\n } else if (name.includes(t)) {\n score += 4 * w;\n hits.push(t);\n } else if (qn.includes(t)) {\n score += 3 * w;\n hits.push(t);\n } else if (fuzzyPartMatch(t, nameParts)) {\n // Morphological / subword match: \"authentication\" ↔ \"authenticate\"\n // (shared prefix), so lexical ask survives word-form differences without\n // a model. The semantic path handles non-shared-root synonyms.\n score += 2 * w;\n hits.push(`~${t}`);\n } else if (file.includes(t)) {\n score += 1 * w;\n hits.push(t);\n }\n }\n return { score, why: hits.length ? `matched: ${hits.join(', ')}` : '' };\n}\n\n/**\n * Importance is a mild tiebreaker, not a doubling. The old `1 + importance`\n * let a hub (importance→1) double its score and outrank a stronger textual\n * match on the actual target; at 0.4 a top hub adds at most 40%, enough to\n * break genuine ties without overriding term evidence.\n */\nconst IMPORTANCE_WEIGHT = 0.4;\n\n/**\n * Per-term specificity weights (IDF) for one question, computed over the graph's\n * symbol-name vocabulary: `ln((N+1)/(df+1)) + 1`, clamped to a sane band. A term\n * that appears in one symbol name is highly discriminating; one that appears in\n * hundreds (\"get\", \"code\", \"run\", \"handler\") is near-noise. Clamped so a term\n * matching nothing (huge idf, but it scores 0 anyway) or everything can't\n * distort the scale. Cost is one O(nodes) pass, dwarfed by the scoring loop.\n */\nfunction termWeights(graph: VgGraph, terms: string[]): (t: string) => number {\n if (terms.length === 0) return () => 1;\n const df = new Map<string, number>();\n let n = 0;\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n n++;\n const name = node.name.toLowerCase();\n const parts = identifierParts(node.name);\n for (const t of terms) {\n if (parts.has(t) || name.includes(t)) df.set(t, (df.get(t) ?? 0) + 1);\n }\n }\n const w = new Map<string, number>();\n for (const t of terms) {\n const idf = Math.log((n + 1) / ((df.get(t) ?? 0) + 1)) + 1;\n // Ceiling of 8 (vs a natural df≈40 idf ≈ 5.4) keeps genuinely rare terms\n // dominant while a term matching nothing/only a file path can't distort.\n w.set(t, Math.max(0.5, Math.min(8, idf)));\n }\n return (t: string) => w.get(t) ?? 1;\n}\n\n/**\n * camelCase / snake_case / kebab split of an identifier → lowercased parts.\n * The separator alternative is Unicode-letter-aware (`\\p{L}\\p{N}`, not\n * ASCII-only `a-zA-Z0-9`) so non-Latin identifiers split on punctuation\n * without losing every character to it; the camelCase boundary lookaround\n * stays ASCII-only since upper/lowercase casing is itself an ASCII-script\n * concept — scripts without case simply never trigger it and fall through to\n * the separator split.\n */\nexport function identifierParts(name: string): Set<string> {\n return new Set(\n name\n .split(/[^\\p{L}\\p{N}]+|(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/u)\n .filter(Boolean)\n .map((s) => s.toLowerCase()),\n );\n}\n\n/** A term fuzzily matches a part if they share a long-enough prefix (same root). */\nfunction fuzzyPartMatch(term: string, parts: Set<string>): boolean {\n for (const part of parts) {\n const shared = sharedPrefixLen(term, part);\n if (shared >= 5 && shared >= 0.6 * Math.min(term.length, part.length)) return true;\n }\n return false;\n}\n\nfunction sharedPrefixLen(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[i] === b[i]) i++;\n return i;\n}\n\nfunction buildContext(\n graph: VgGraph,\n index: GraphIndex,\n question: string,\n seeds: QueryMatch[],\n budget: number,\n): { context: string; tokensEstimate: number } {\n const lines: string[] = [];\n lines.push(`# Context for: ${question}`);\n lines.push('');\n if (seeds.length === 0) {\n lines.push('_No matching symbols found in the map. Try different terms, or `vg hubs` for the most important code._');\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n }\n\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`## ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = index.callees(node.id).map((x) => x.node.qualifiedName);\n const callers = index.callers(node.id).map((x) => x.node.qualifiedName);\n if (callees.length) block.push(`calls: ${unique(callees).slice(0, 8).join(', ')}`);\n if (callers.length) block.push(`called by: ${unique(callers).slice(0, 8).join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)} · area #${node.area}${node.isHub ? ' · hub' : ''} · ${why}`);\n block.push('');\n\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 2) break;\n lines.push(...block);\n }\n\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n}\n\nfunction unique(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction estimateTokens(text: string): number {\n // ~4 chars per token, the standard rough estimate.\n return Math.ceil(text.length / 4);\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n","import type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Lenient node resolution (VG-CLI-SPEC §3.3): resolve `<name>` by content-hash\n * id, qualified name, `file:line`, short name, or glob. Returns candidates\n * ranked by importance so the best match is first; ambiguity is surfaced (the\n * caller offers `--pick`). Deterministic ordering throughout.\n */\nexport function findNodes(graph: VgGraph, query: string): GraphNode[] {\n const q = query.trim();\n if (!q) return [];\n\n // 1. exact content-hash id\n const byId = graph.nodes.filter((n) => n.id === q);\n if (byId.length) return byId;\n\n // 2. file:line (e.g. src/order.ts:12) → smallest node spanning that line\n const fileLine = /^(.*):(\\d+)$/.exec(q);\n if (fileLine) {\n const file = fileLine[1];\n const line = Number(fileLine[2]);\n const spanning = graph.nodes\n .filter((n) => n.file === file && n.span.start <= line && n.span.end >= line && n.kind !== 'file')\n .sort((a, b) => a.span.end - a.span.start - (b.span.end - b.span.start));\n if (spanning.length) return spanning;\n }\n\n // 3. glob (contains * or ?)\n if (/[*?]/.test(q)) {\n const re = globToRegExp(q);\n return rank(graph.nodes.filter((n) => re.test(n.qualifiedName) || re.test(n.name) || re.test(n.file)));\n }\n\n // 4. exact qualified name, then short name, then case-insensitive\n const byQn = graph.nodes.filter((n) => n.qualifiedName === q);\n if (byQn.length) return rank(byQn);\n const byName = graph.nodes.filter((n) => n.name === q);\n if (byName.length) return rank(byName);\n\n const lower = q.toLowerCase();\n const ci = graph.nodes.filter(\n (n) => n.qualifiedName.toLowerCase() === lower || n.name.toLowerCase() === lower,\n );\n if (ci.length) return rank(ci);\n\n // 5. substring on qualified name (last resort, ranked)\n return rank(graph.nodes.filter((n) => n.qualifiedName.toLowerCase().includes(lower))).slice(0, 25);\n}\n\n/** Resolve to a single node, honoring a 1-based `--pick`. */\nexport function resolveOne(\n graph: VgGraph,\n query: string,\n pick?: number,\n): { node?: GraphNode; candidates: GraphNode[] } {\n const candidates = findNodes(graph, query);\n if (candidates.length === 0) return { candidates };\n if (pick && pick >= 1 && pick <= candidates.length) return { node: candidates[pick - 1], candidates };\n if (candidates.length === 1) return { node: candidates[0], candidates };\n return { candidates }; // ambiguous\n}\n\nexport function nodeById(graph: VgGraph, id: string): GraphNode | undefined {\n return graph.nodes.find((n) => n.id === id);\n}\n\nfunction rank(nodes: GraphNode[]): GraphNode[] {\n return [...nodes].sort(\n (a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName),\n );\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*').replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`, 'i');\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 { indexFor } from './relations.js';\nimport type { EdgeKind, VgGraph } from '../schema.js';\n\n/**\n * Deterministic reverse-reachability impact analysis (VG-CLI-SPEC §3.5).\n *\n * \"What breaks if `<node>` changes\" = everything that (transitively) depends on\n * it: its callers, importers, and subtypes. We BFS *backwards* along dependency\n * edges, bounded by depth, with a confidence that decays with distance (direct =\n * high; transitive lower; ambiguous/dynamic edges already carry lower edge\n * confidence which we fold in). Test-impact selection (`--tests`) lands in\n * Phase 2; this is the structural blast radius.\n */\n\nconst DEPEND_EDGES = new Set<EdgeKind>(['call', 'import', 'extends', 'implements', 'references']);\n\nexport interface ImpactItem {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface ImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: ImpactItem[];\n direct: number;\n transitive: number;\n /** Lowest edge confidence encountered (e.g. a dynamic-dispatch edge). */\n minEdgeConfidence: number;\n}\n\nexport function impactOf(graph: VgGraph, rootId: string, opts: { depth?: number } = {}): ImpactResult {\n const maxDepth = Math.max(1, opts.depth ?? 4);\n const index = indexFor(graph);\n const root = index.node(rootId);\n\n const affected = new Map<string, ImpactItem>();\n let minEdgeConfidence = 1;\n\n // BFS over incoming dependency edges (dependents of the frontier).\n let frontier: { id: string; conf: number }[] = [{ id: rootId, conf: 1 }];\n for (let depth = 1; depth <= maxDepth; depth++) {\n const nextFrontier: { id: string; conf: number }[] = [];\n for (const { id, conf } of frontier) {\n for (const e of index.in(id)) {\n if (!DEPEND_EDGES.has(e.kind)) continue;\n minEdgeConfidence = Math.min(minEdgeConfidence, e.confidence);\n const dependentId = e.src;\n if (dependentId === rootId || affected.has(dependentId)) continue;\n const node = index.node(dependentId);\n if (!node) continue;\n const conf2 = round(conf * e.confidence * 0.9); // decay with distance\n affected.set(dependentId, {\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n depth,\n confidence: conf2,\n });\n nextFrontier.push({ id: dependentId, conf: conf2 });\n }\n }\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n const items = [...affected.values()].sort(\n (a, b) => a.depth - b.depth || b.confidence - a.confidence || a.name.localeCompare(b.name),\n );\n\n return {\n root: { id: rootId, name: root?.qualifiedName ?? rootId },\n depth: maxDepth,\n affected: items,\n direct: items.filter((i) => i.depth === 1).length,\n transitive: items.filter((i) => i.depth > 1).length,\n minEdgeConfidence: round(minEdgeConfidence),\n };\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\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 path from 'node:path';\n\n/**\n * Dependency currency (VG-LOCAL-MODELS §9 / VG-DEVELOPMENT-PLAN Phase 2.4).\n *\n * Default path is **offline and deterministic**: inventory dependencies from\n * manifests and resolve installed versions from node_modules. Currency against\n * \"latest/EOL/CVE\" needs data, so it is strictly **opt-in** (`--online`, which\n * queries the public npm registry) — the offline core never touches the network.\n * Full DriftScore/CVE/EOL governance is the Vibgrate platform (the funnel).\n */\n\n/** Supported dependency ecosystems (manifest + lockfile). Extend this list to widen coverage. */\nexport const ECOSYSTEMS = ['npm', 'pypi', 'go', 'rust', 'ruby', 'php', 'dotnet', 'swift', 'dart', 'java'] as const;\nexport type Ecosystem = (typeof ECOSYSTEMS)[number];\n\nexport interface DepRecord {\n name: string;\n ecosystem: Ecosystem;\n declared: string; // declared range/version\n installed?: string; // resolved installed version (npm)\n latest?: string; // from --online\n drift?: 'major' | 'minor' | 'patch' | 'current' | 'unknown';\n}\n\nexport interface DriftInventory {\n records: DepRecord[];\n counts: { total: number } & Record<Ecosystem, number>;\n}\n\nexport function inventory(root: string): DriftInventory {\n const manifests = findManifests(root);\n const records: DepRecord[] = [];\n records.push(...npmDeps(manifests.npm));\n records.push(...pypiDeps(manifests.pypi));\n records.push(...goDeps(manifests.go));\n records.push(...cargoDeps(manifests.rust));\n records.push(...rubyDeps(manifests.ruby));\n records.push(...phpDeps(manifests.php));\n records.push(...dotnetDeps(manifests.dotnet));\n records.push(...swiftDeps(manifests.swift));\n records.push(...dartDeps(manifests.dart));\n records.push(...javaDeps(manifests.java));\n // Dedupe across sub-projects by ecosystem+name (keep first in path order, so a\n // dep used by many packages of a monorepo counts once). Deterministic.\n const seen = new Set<string>();\n const deduped = records.filter((r) => {\n const key = `${r.ecosystem}\\0${r.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n deduped.sort((a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.name.localeCompare(b.name));\n const counts = { total: deduped.length } as DriftInventory['counts'];\n for (const e of ECOSYSTEMS) counts[e] = 0;\n for (const r of deduped) counts[r.ecosystem]++;\n return { records: deduped, counts };\n}\n\n/** Directories never worth descending into when hunting for manifests. */\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'out', '.vibgrate', 'vendor',\n '.venv', 'venv', 'env', '__pycache__', 'target', '.next', '.nuxt', 'coverage', '.cache',\n]);\n\ntype ManifestSet = Record<Ecosystem, string[]>;\n\n/** Exact-name manifest → ecosystem. `.csproj`/`.fsproj` are matched by extension below. */\nconst MANIFEST_BY_FILE: Record<string, Ecosystem> = {\n 'package.json': 'npm',\n 'requirements.txt': 'pypi',\n 'pyproject.toml': 'pypi',\n 'go.mod': 'go',\n 'Cargo.toml': 'rust',\n Gemfile: 'ruby',\n 'composer.json': 'php',\n 'Package.swift': 'swift',\n 'pubspec.yaml': 'dart',\n 'pom.xml': 'java',\n 'build.gradle': 'java',\n 'build.gradle.kts': 'java',\n};\n\n/**\n * Walk the tree (bounded depth/count, skipping build/vendor dirs) for dependency\n * manifests — so a polyglot monorepo with nested manifests is inventoried, not just\n * the repo root. Results are path-sorted for determinism.\n */\nfunction findManifests(root: string): ManifestSet {\n const set = Object.fromEntries(ECOSYSTEMS.map((e) => [e, [] as string[]])) as ManifestSet;\n const MAX_ENTRIES = 20000;\n let scanned = 0;\n const walk = (dir: string, depth: number): void => {\n if (depth > 8 || scanned > MAX_ENTRIES) 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 scanned++;\n if (scanned > MAX_ENTRIES) break;\n if (e.isDirectory()) {\n if (!SKIP_DIRS.has(e.name) && !e.name.startsWith('.')) walk(path.join(dir, e.name), depth + 1);\n continue;\n }\n const eco = MANIFEST_BY_FILE[e.name] ?? (/\\.(cs|fs)proj$/i.test(e.name) ? 'dotnet' : undefined);\n if (eco) set[eco].push(path.join(dir, e.name));\n }\n };\n walk(root, 0);\n for (const e of ECOSYSTEMS) set[e].sort();\n return set;\n}\n\nfunction npmDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n try {\n pkg = JSON.parse(fs.readFileSync(file, 'utf8'));\n } catch {\n continue;\n }\n const dir = path.dirname(file);\n const all = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const [name, declared] of Object.entries(all)) {\n out.push({ name, ecosystem: 'npm', declared, installed: installedNpmVersion(dir, name) });\n }\n }\n return out;\n}\n\n/** Resolve an installed version from the nearest node_modules at or above `dir`. */\nfunction installedNpmVersion(dir: string, name: string): string | undefined {\n let cur = dir;\n for (let i = 0; i < 12; i++) {\n const p = path.join(cur, 'node_modules', name, 'package.json');\n try {\n return (JSON.parse(fs.readFileSync(p, 'utf8')) as { version: string }).version;\n } catch {\n /* keep climbing */\n }\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return undefined;\n}\n\n/**\n * Resolve the *installed-tree* version for ecosystems whose installed metadata lives\n * outside `node_modules` (npm is handled inline above). Powers the lockfile↔installed\n * mismatch alert (D13 / G8) for Python and PHP. Returns undefined when not found —\n * never a fabricated version.\n */\nexport function installedTreeVersion(root: string, ecosystem: Ecosystem, name: string): string | undefined {\n if (ecosystem === 'pypi') return installedPypiVersion(root, name);\n if (ecosystem === 'php') return installedPhpVersion(root, name);\n return undefined;\n}\n\nfunction normalizePep503(name: string): string {\n return name.trim().toLowerCase().replace(/[-_.]+/g, '-');\n}\n\n/** Candidate site-packages dirs inside a venv (POSIX `lib/pythonX.Y/...` + Windows `Lib/...`). */\nfunction sitePackagesDirs(base: string): string[] {\n const out: string[] = [];\n try {\n for (const d of fs.readdirSync(path.join(base, 'lib'))) {\n if (d.startsWith('python')) out.push(path.join(base, 'lib', d, 'site-packages'));\n }\n } catch {\n /* no lib dir */\n }\n out.push(path.join(base, 'Lib', 'site-packages'));\n return out;\n}\n\n/** Python: a `<Name>-<Version>.dist-info` dir in a project venv's site-packages. */\nfunction installedPypiVersion(root: string, name: string): string | undefined {\n const target = normalizePep503(name);\n for (const venv of ['.venv', 'venv', 'env', '.tox']) {\n for (const sp of sitePackagesDirs(path.join(root, venv))) {\n let entries: string[];\n try {\n entries = fs.readdirSync(sp);\n } catch {\n continue;\n }\n for (const entry of entries) {\n const m = /^(.+?)-(\\d[^-]*)\\.dist-info$/.exec(entry);\n if (m && normalizePep503(m[1]) === target) return m[2];\n }\n }\n }\n return undefined;\n}\n\n/** PHP: `vendor/composer/installed.json` (newer `{packages:[…]}` or older root array). */\nfunction installedPhpVersion(root: string, name: string): string | undefined {\n let data: unknown;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'vendor', 'composer', 'installed.json'), 'utf8'));\n } catch {\n return undefined;\n }\n const pkgs = Array.isArray(data) ? data : (data as { packages?: unknown }).packages;\n if (!Array.isArray(pkgs)) return undefined;\n const p = pkgs.find((x) => x && typeof x === 'object' && (x as { name?: string }).name === name) as\n | { version?: string }\n | undefined;\n return typeof p?.version === 'string' ? p.version.replace(/^v/, '') : undefined;\n}\n\nfunction pypiDeps(files: string[]): DepRecord[] {\n const byName = new Map<string, DepRecord>();\n const add = (name: string, declared: string) => {\n const clean = name.trim().replace(/\\[.*\\]$/, ''); // drop extras: fastapi[all] → fastapi\n if (!clean || clean.toLowerCase() === 'python') return;\n if (!byName.has(clean)) byName.set(clean, { name: clean, ecosystem: 'pypi', declared: declared.trim() || '*' });\n };\n\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n if (path.basename(file) === 'requirements.txt') {\n for (const line of text.split('\\n')) {\n const t = line.trim();\n if (!t || t.startsWith('#') || t.startsWith('-')) continue;\n const m = /^([A-Za-z0-9._-]+(?:\\[[^\\]]*\\])?)\\s*([<>=!~).*]+.*)?$/.exec(t);\n if (m) add(m[1], m[2] ?? '*');\n }\n } else {\n // pyproject.toml — PEP 621 [project].dependencies + Poetry [tool.poetry.dependencies]\n for (const dep of pep621Dependencies(text)) {\n const m = /^([A-Za-z0-9._-]+(?:\\[[^\\]]*\\])?)\\s*(.*)$/.exec(dep.trim());\n if (m) add(m[1], m[2] ?? '*');\n }\n for (const [name, spec] of poetryDependencies(text)) add(name, spec);\n }\n }\n\n return [...byName.values()];\n}\n\n/** Extract the quoted entries of the PEP 621 `[project] dependencies = [...]` array. */\nfunction pep621Dependencies(text: string): string[] {\n const section = sectionBody(text, 'project');\n if (!section) return [];\n const start = /dependencies\\s*=\\s*\\[/.exec(section);\n if (!start) return [];\n // Scan from the opening `[` to its matching `]` at depth 0, respecting strings\n // (so a `]` inside an entry like \"pydantic[email]\" doesn't end the array early).\n let depth = 0;\n let inStr = false;\n let strCh = '';\n const out: string[] = [];\n let cur = '';\n for (let i = start.index + start[0].length - 1; i < section.length; i++) {\n const ch = section[i];\n if (inStr) {\n if (ch === strCh) {\n out.push(cur);\n inStr = false;\n } else cur += ch;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n inStr = true;\n strCh = ch;\n cur = '';\n } else if (ch === '[') depth++;\n else if (ch === ']') {\n depth--;\n if (depth === 0) break;\n }\n }\n return out;\n}\n\n/** Extract `name = \"spec\"` lines from Poetry dependency tables. */\nfunction poetryDependencies(text: string): [string, string][] {\n const out: [string, string][] = [];\n const lines = text.split('\\n');\n let inDeps = false;\n for (const raw of lines) {\n const line = raw.trim();\n if (line.startsWith('[')) {\n inDeps = /^\\[tool\\.poetry(\\.group\\.[^.\\]]+)?\\.dependencies\\]$/.test(line);\n continue;\n }\n if (!inDeps || !line || line.startsWith('#')) continue;\n const m = /^([A-Za-z0-9._-]+)\\s*=\\s*[\"']([^\"']*)[\"']/.exec(line);\n if (m) out.push([m[1], m[2] || '*']);\n }\n return out;\n}\n\n/** The text of a top-level TOML table `[name]` up to the next top-level table. */\nfunction sectionBody(text: string, name: string): string | null {\n const lines = text.split('\\n');\n let capturing = false;\n const body: string[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (/^\\[/.test(line)) {\n if (capturing) break;\n capturing = line === `[${name}]`;\n continue;\n }\n if (capturing) body.push(raw);\n }\n return capturing || body.length ? body.join('\\n') : null;\n}\n\nfunction goDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const mod of files) {\n let text: string;\n try {\n text = fs.readFileSync(mod, 'utf8');\n } catch {\n continue;\n }\n // Handles both block form (`require (\\n mod v1.2.3\\n)`) and single-line\n // `require mod v1.2.3` by allowing an optional leading `require`.\n const re = /^\\s*(?:require\\s+)?([\\w./-]+)\\s+v(\\S+)/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) {\n if (m[1] === 'go' || m[1] === 'require' || m[1].startsWith('module')) continue;\n out.push({ name: m[1], ecosystem: 'go', declared: `v${m[2]}` });\n }\n }\n return out;\n}\n\n/**\n * Parse `Cargo.toml` dependency tables for declared versions. Handles the inline\n * forms `name = \"1.0\"` and `name = { version = \"1.0\", … }` in `[dependencies]`,\n * `[dev-dependencies]`, and `[build-dependencies]`. The `[dependencies.foo]`\n * subtable form is a follow-up (rare in practice); exact pins come from Cargo.lock.\n */\nfunction cargoDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n for (const table of ['dependencies', 'dev-dependencies', 'build-dependencies']) {\n const body = sectionBody(text, table);\n if (!body) continue;\n for (const raw of body.split('\\n')) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n const m = /^([A-Za-z0-9._-]+)\\s*=\\s*(.+)$/.exec(line);\n if (!m) continue;\n const rhs = m[2].trim();\n let declared = '*';\n if (rhs.startsWith('\"')) {\n const sm = /^\"([^\"]+)\"/.exec(rhs);\n if (sm) declared = sm[1];\n } else if (rhs.startsWith('{')) {\n const vm = /version\\s*=\\s*\"([^\"]+)\"/.exec(rhs);\n if (vm) declared = vm[1];\n }\n out.push({ name: m[1], ecosystem: 'rust', declared });\n }\n }\n }\n return out;\n}\n\n/** Ruby `Gemfile`: `gem \"name\", \"~> 1.2\"` (version constraint optional). */\nfunction rubyDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n const re = /^\\s*gem\\s+[\"']([^\"']+)[\"']\\s*(?:,\\s*[\"']([^\"']+)[\"'])?/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) out.push({ name: m[1], ecosystem: 'ruby', declared: m[2] ?? '*' });\n }\n return out;\n}\n\n/** PHP `composer.json`: `require`/`require-dev` maps; skip `php` and `ext-*` platform reqs. */\nfunction phpDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let pkg: { require?: Record<string, string>; 'require-dev'?: Record<string, string> };\n try {\n pkg = JSON.parse(fs.readFileSync(file, 'utf8'));\n } catch {\n continue;\n }\n const all = { ...pkg.require, ...pkg['require-dev'] };\n for (const [name, declared] of Object.entries(all)) {\n if (!name.includes('/')) continue; // platform reqs (php, ext-*, lib-*) have no vendor/\n out.push({ name, ecosystem: 'php', declared });\n }\n }\n return out;\n}\n\n/** .NET `*.csproj`/`*.fsproj`: `<PackageReference Include=\"X\" Version=\"Y\" />` (attr order tolerant). */\nfunction dotnetDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n const tagRe = /<PackageReference\\b[^>]*>/gi;\n let m: RegExpExecArray | null;\n while ((m = tagRe.exec(text))) {\n const inc = /Include\\s*=\\s*\"([^\"]+)\"/i.exec(m[0]);\n if (!inc) continue;\n const ver = /Version\\s*=\\s*\"([^\"]+)\"/i.exec(m[0]);\n out.push({ name: inc[1], ecosystem: 'dotnet', declared: ver?.[1] ?? '*' });\n }\n }\n return out;\n}\n\n/**\n * Swift `Package.swift`: `.package(url: \"…/swift-nio.git\", from: \"2.0.0\")`. The crate\n * name is derived from the URL's last path segment (matching Package.resolved's\n * `identity`); the declared version is the first version-looking literal after the url.\n */\nfunction swiftDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n const re = /\\.package\\(/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) {\n const win = text.slice(m.index, m.index + 200);\n const urlM = /url:\\s*\"([^\"]+)\"/.exec(win);\n if (!urlM) continue;\n const name = (urlM[1].replace(/\\.git$/, '').split('/').filter(Boolean).pop() ?? urlM[1]).toLowerCase();\n const verM = /\"(\\d+\\.\\d+(?:\\.\\d+)?)\"/.exec(win.slice(urlM.index + urlM[0].length));\n out.push({ name, ecosystem: 'swift', declared: verM?.[1] ?? '*' });\n }\n }\n return out;\n}\n\n/** Dart `pubspec.yaml`: `dependencies:` / `dev_dependencies:` blocks of `name: ^1.2.3`. */\nfunction dartDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n let section = '';\n for (const raw of text.split('\\n')) {\n const top = /^([a-z_]+):\\s*$/.exec(raw);\n if (top) {\n section = top[1];\n continue;\n }\n if (section !== 'dependencies' && section !== 'dev_dependencies') continue;\n const m = /^ ([A-Za-z0-9_.]+):\\s*(\\S.*)?$/.exec(raw);\n if (!m || m[1] === 'flutter' || m[1] === 'sdk') continue;\n const declared = (m[2] ?? '').replace(/^[\"']|[\"']$/g, '').trim() || '*';\n out.push({ name: m[1], ecosystem: 'dart', declared });\n }\n }\n return out;\n}\n\n/**\n * Java: Maven `pom.xml` (`<dependency>` blocks) and Gradle `build.gradle(.kts)`\n * (`implementation \"g:a:v\"`). Name is `groupId:artifactId`. Maven has no standard\n * lockfile, so the served version is the pom-declared one; Gradle pins come from\n * `gradle.lockfile`. A `${property}` Maven version is recorded as `*` (unresolved).\n */\nfunction javaDeps(files: string[]): DepRecord[] {\n const out: DepRecord[] = [];\n for (const file of files) {\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n if (path.basename(file) === 'pom.xml') {\n for (const block of text.match(/<dependency>[\\s\\S]*?<\\/dependency>/g) ?? []) {\n const g = /<groupId>([^<]+)<\\/groupId>/.exec(block);\n const a = /<artifactId>([^<]+)<\\/artifactId>/.exec(block);\n if (!g || !a) continue;\n const v = /<version>([^<]+)<\\/version>/.exec(block);\n const declared = v ? (v[1].trim().startsWith('${') ? '*' : v[1].trim()) : '*';\n out.push({ name: `${g[1].trim()}:${a[1].trim()}`, ecosystem: 'java', declared });\n }\n } else {\n const re = /(?:implementation|api|compileOnly|runtimeOnly|testImplementation|testRuntimeOnly|annotationProcessor)\\s*[(]?\\s*[\"']([\\w.-]+):([\\w.-]+):([^\"']+)[\"']/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) out.push({ name: `${m[1]}:${m[2]}`, ecosystem: 'java', declared: m[3] });\n }\n }\n return out;\n}\n\n/** Opt-in online enrichment: query npm for `latest` and classify drift. */\nexport async function enrichOnline(records: DepRecord[], fetchImpl = globalThis.fetch): Promise<void> {\n for (const r of records) {\n if (r.ecosystem !== 'npm' || !r.installed) continue;\n try {\n const res = await fetchImpl(`https://registry.npmjs.org/${encodeURIComponent(r.name)}/latest`);\n if (!res.ok) continue;\n const data = (await res.json()) as { version?: string };\n r.latest = data.version;\n r.drift = classify(r.installed, r.latest);\n } catch {\n r.drift = 'unknown';\n }\n }\n}\n\nfunction classify(installed: string, latest?: string): DepRecord['drift'] {\n if (!latest) return 'unknown';\n const a = installed.split('.').map(Number);\n const b = latest.split('.').map(Number);\n if (a[0] !== b[0]) return 'major';\n if (a[1] !== b[1]) return 'minor';\n if (a[2] !== b[2]) return 'patch';\n return 'current';\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","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DepRecord } from './drift.js';\n\n/**\n * Lockfile-pinned version resolution (VG-LIB-SUPERSET-PLAN A.2 / D13).\n *\n * The version we serve docs for should be the one your **lockfile** pins, not\n * whatever happens to be unpacked in `node_modules` (which is empty in CI / a\n * fresh clone). This reads the pin deterministically and offline. Where a lockfile\n * isn't present or parseable we return `undefined` and the caller falls back to the\n * installed tree, then the declared range — we never fabricate a version.\n *\n * First slice: npm (`package-lock.json` v1/v2/v3, `yarn.lock`). Other ecosystems\n * (`poetry.lock`, `go.sum`, `Cargo.lock`, …) follow the same shape and return\n * `undefined` until their parser lands — honest degradation, no false mismatch.\n */\nexport function lockfileVersion(root: string, ecosystem: DepRecord['ecosystem'], name: string): string | undefined {\n if (ecosystem === 'npm') return packageLockVersion(root, name) ?? yarnLockVersion(root, name);\n if (ecosystem === 'pypi') return pypiLockVersion(root, name);\n if (ecosystem === 'rust') return tomlPackageLock(root, 'Cargo.lock', name, rustName);\n if (ecosystem === 'ruby') return gemfileLock(root, name);\n if (ecosystem === 'php') return composerLock(root, name);\n if (ecosystem === 'dotnet') return packagesLock(root, name);\n if (ecosystem === 'swift') return packageResolved(root, name);\n if (ecosystem === 'dart') return pubspecLock(root, name);\n if (ecosystem === 'java') return gradleLock(root, name);\n return undefined;\n}\n\n/** Gradle `gradle.lockfile` — lines `group:artifact:version=configurations…`. */\nfunction gradleLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'gradle.lockfile'), 'utf8');\n } catch {\n return undefined;\n }\n const m = new RegExp(`^${escapeRegExp(name)}:([^=\\\\s]+)=`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** Swift `Package.resolved` — JSON pins (v2/v3 `pins[]`, v1 `object.pins[]`); match `identity`. */\nfunction packageResolved(root: string, name: string): string | undefined {\n let data: {\n pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }>;\n object?: { pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }> };\n };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Package.resolved'), 'utf8'));\n } catch {\n return undefined;\n }\n const pins = data.pins ?? data.object?.pins;\n if (!Array.isArray(pins)) return undefined;\n const target = name.toLowerCase();\n for (const p of pins) {\n const id = (p.identity ?? p.package ?? '').toLowerCase();\n if (id === target && p.state?.version) return p.state.version;\n }\n return undefined;\n}\n\n/** Dart `pubspec.lock` — YAML; each ` <name>:` block carries `version: \"x.y.z\"`. */\nfunction pubspecLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pubspec.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inPkg = false;\n for (const line of text.split('\\n')) {\n const key = /^ ([A-Za-z0-9_.]+):\\s*$/.exec(line);\n if (key) {\n inPkg = key[1] === name;\n continue;\n }\n if (inPkg) {\n const vm = /^\\s+version:\\s*\"?([^\"\\s]+)\"?/.exec(line);\n if (vm) return vm[1];\n }\n }\n return undefined;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Ruby `Gemfile.lock` — the `specs:` block lists ` name (1.2.3)` (4-space indent). */\nfunction gemfileLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'Gemfile.lock'), 'utf8');\n } catch {\n return undefined;\n }\n // Spec definitions are 4-space-indented with a concrete (digit-leading) version;\n // nested dep constraints (6-space) and the DEPENDENCIES list (2-space) don't match.\n const m = new RegExp(`^ ${escapeRegExp(name)} \\\\((\\\\d[^)]*)\\\\)`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** PHP `composer.lock` — JSON `packages` / `packages-dev` arrays of `{ name, version }`. */\nfunction composerLock(root: string, name: string): string | undefined {\n let data: Record<string, Array<{ name?: string; version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'composer.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n for (const section of ['packages', 'packages-dev']) {\n const arr = data[section];\n if (!Array.isArray(arr)) continue;\n const p = arr.find((x) => x && x.name === name);\n if (p && typeof p.version === 'string') return p.version.replace(/^v/, '');\n }\n return undefined;\n}\n\n/** .NET `packages.lock.json` — `dependencies.<framework>.<id>.resolved` (ids case-insensitive). */\nfunction packagesLock(root: string, name: string): string | undefined {\n let data: { dependencies?: Record<string, Record<string, { resolved?: string }>> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'packages.lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = name.toLowerCase();\n for (const fw of Object.values(data.dependencies ?? {})) {\n if (!fw || typeof fw !== 'object') continue;\n for (const [id, v] of Object.entries(fw)) {\n if (id.toLowerCase() === target && v && typeof v.resolved === 'string') return v.resolved;\n }\n }\n return undefined;\n}\n\n/** PEP 503 name normalisation — names are case-insensitive and -/_/. are equivalent. */\nfunction pep503(name: string): string {\n return name.trim().toLowerCase().replace(/[-_.]+/g, '-');\n}\n\n/** Crate names: case-insensitive on crates.io; published name used verbatim otherwise. */\nfunction rustName(name: string): string {\n return name.trim().toLowerCase();\n}\n\n/** Python: `poetry.lock` / `uv.lock` (TOML `[[package]]`), then `Pipfile.lock` (JSON). */\nfunction pypiLockVersion(root: string, name: string): string | undefined {\n return (\n tomlPackageLock(root, 'poetry.lock', name, pep503) ??\n tomlPackageLock(root, 'uv.lock', name, pep503) ??\n pipfileLock(root, name)\n );\n}\n\n/**\n * Parse a TOML lockfile of `[[package]]` tables (poetry, uv, and Cargo.lock share this shape) for\n * the pinned version, without a TOML dependency: split on the array-of-tables\n * header and match `name`/`version` string keys within a block.\n */\nfunction tomlPackageLock(root: string, file: string, name: string, normalize: (s: string) => string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, file), 'utf8');\n } catch {\n return undefined;\n }\n const target = normalize(name);\n for (const block of text.split(/\\[\\[package\\]\\]/)) {\n const nm = /(?:^|\\n)\\s*name\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (nm && normalize(nm[1]) === target) {\n const ver = /(?:^|\\n)\\s*version\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (ver) return ver[1];\n }\n }\n return undefined;\n}\n\n/** Pipenv `Pipfile.lock` — JSON; versions look like `\"==1.2.3\"`. */\nfunction pipfileLock(root: string, name: string): string | undefined {\n let data: Record<string, Record<string, { version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Pipfile.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = pep503(name);\n for (const section of ['default', 'develop']) {\n const deps = data[section];\n if (!deps || typeof deps !== 'object') continue;\n for (const [k, v] of Object.entries(deps)) {\n if (pep503(k) === target && v && typeof v.version === 'string') {\n return v.version.replace(/^==/, '');\n }\n }\n }\n return undefined;\n}\n\n/** npm `package-lock.json` — JSON, deterministic, no dependency. */\nfunction packageLockVersion(root: string, name: string): string | undefined {\n let data: { packages?: Record<string, { version?: string }>; dependencies?: Record<string, { version?: string }> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'package-lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n // v2/v3: packages keyed by install path; the top-level dep is \"node_modules/<name>\".\n const top = data.packages?.[`node_modules/${name}`]?.version;\n if (typeof top === 'string') return top;\n // v1: flat dependencies map.\n const v1 = data.dependencies?.[name]?.version;\n return typeof v1 === 'string' ? v1 : undefined;\n}\n\n/**\n * `yarn.lock` — a custom text format. Each block opens with one or more\n * comma-separated `name@range` specifiers (possibly quoted) and ends with an\n * indented `version \"x.y.z\"`. We find the block whose header names our package and\n * return its version. Scoped names (`@scope/pkg@range`) are handled via lastIndexOf.\n */\nfunction yarnLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'yarn.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inBlock = false;\n for (const line of text.split('\\n')) {\n if (line && !/^\\s/.test(line) && !line.startsWith('#')) {\n inBlock = headerNamesPackage(line, name);\n } else if (inBlock) {\n const m = /^\\s+version:?\\s+\"?([^\"\\s]+)\"?/.exec(line);\n if (m) return m[1];\n }\n }\n return undefined;\n}\n\nfunction headerNamesPackage(header: string, name: string): boolean {\n return header\n .replace(/:\\s*$/, '')\n .split(',')\n .some((spec) => {\n const s = spec.trim().replace(/^\"|\"$/g, '');\n const at = s.lastIndexOf('@');\n if (at <= 0) return false; // <=0 keeps scoped leading '@' from matching empty name\n const specName = s.slice(0, at);\n return specName === name;\n });\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { stableStringify } from './serialize.js';\nimport { hashString } from './hash.js';\nimport { inventory, installedTreeVersion } from './drift.js';\nimport { lockfileVersion } from './lockfile.js';\n\n/**\n * `vg lib` — a deterministic, on-disk library-currency catalog: version-correct\n * usage docs for the **exact version in your lockfile**, drift-annotated, from\n * on-disk sources (no key).\n *\n * The catalog (`vibgrate.lib.json`) is small and committable; doc bodies live in\n * `.vibgrate/lib/<id>.md` so the team shares them on pull. Ingestion is\n * deterministic from local sources; URL/llms.txt ingestion is opt-in network.\n */\n\nexport const LIB_SCHEMA = 'vg-lib/1.0' as const;\n\nexport interface LibSource {\n type: 'local' | 'llms.txt' | 'website' | 'openapi' | 'git';\n location: string;\n}\n\nexport interface LibEntry {\n id: string;\n name: string;\n version: string; // cataloged doc version ('*' if unknown)\n source: LibSource;\n docFile: string; // relative to root (.vibgrate/lib/<id>.md)\n docHash: string;\n bytes: number;\n}\n\nexport interface LibCatalog {\n schemaVersion: typeof LIB_SCHEMA;\n libraries: Record<string, LibEntry>;\n}\n\nexport function catalogPath(root: string): string {\n return path.join(root, 'vibgrate.lib.json');\n}\nexport function libDir(root: string): string {\n return path.join(root, '.vibgrate', 'lib');\n}\n\nexport function libId(name: string): string {\n return name.trim().toLowerCase().replace(/^@/, '').replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');\n}\n\nexport function loadCatalog(root: string): LibCatalog {\n const file = catalogPath(root);\n if (fs.existsSync(file)) {\n try {\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as LibCatalog;\n if (data.schemaVersion === LIB_SCHEMA && data.libraries) return data;\n } catch {\n /* fall through to empty */\n }\n }\n return { schemaVersion: LIB_SCHEMA, libraries: {} };\n}\n\nexport function saveCatalog(root: string, catalog: LibCatalog): void {\n fs.writeFileSync(catalogPath(root), `${stableStringify(catalog, 2)}\\n`);\n}\n\n/** Resolve a fuzzy name to a catalog entry (exact id, name, or substring). */\nexport function resolveLib(catalog: LibCatalog, name: string): LibEntry | undefined {\n const id = libId(name);\n if (catalog.libraries[id]) return catalog.libraries[id];\n const lower = name.toLowerCase();\n const all = Object.values(catalog.libraries);\n return (\n all.find((e) => e.name.toLowerCase() === lower) ??\n all.find((e) => e.id.includes(id) || e.name.toLowerCase().includes(lower))\n );\n}\n\n/** The lockfile/manifest version of a dependency, for drift annotation. */\nexport function installedVersion(root: string, name: string): string | undefined {\n const rec = inventory(root).records.find((r) => r.name === name);\n return rec?.installed ?? rec?.declared;\n}\n\nexport interface VersionResolution {\n /** The version we serve docs for: lockfile pin → installed tree → declared range. */\n served?: string;\n source: 'lockfile' | 'installed' | 'declared' | 'unknown';\n lockfile?: string;\n installed?: string;\n declared?: string;\n /** Set when the lockfile pin and the installed tree disagree (the dev should fix). */\n mismatch?: { lockfile: string; installed: string; note: string };\n}\n\nconst stripRange = (v?: string): string | undefined => v?.replace(/^[v^~>=<\\s]+/, '');\n\n/**\n * Resolve the version to serve docs for, **lockfile-first**, and detect a\n * lockfile↔installed disagreement (VG-LIB-SUPERSET-PLAN D13 / G8). Precedence:\n * lockfile pin → installed tree → declared range. When both a lockfile pin and an\n * installed version are readable and differ, surface a mismatch the dev should fix —\n * a signal a hosted docs service can't produce (it has no view of your installed tree).\n */\nexport function resolveVersion(root: string, name: string): VersionResolution {\n const rec = inventory(root).records.find((r) => r.name === name);\n const declared = rec?.declared;\n // npm installed comes from node_modules (via inventory); other ecosystems read their\n // installed tree (Python .dist-info, PHP installed.json) so the mismatch alert applies too.\n const installed = rec?.installed ?? (rec ? installedTreeVersion(root, rec.ecosystem, name) : undefined);\n const lockfile = rec ? lockfileVersion(root, rec.ecosystem, name) : undefined;\n\n let mismatch: VersionResolution['mismatch'];\n if (lockfile && installed && stripRange(lockfile) !== stripRange(installed)) {\n mismatch = {\n lockfile,\n installed,\n note: `lockfile pins ${lockfile} but the installed tree has ${installed} — your install is out of sync with the lockfile (re-install or commit the lock)`,\n };\n }\n\n const served = lockfile ?? installed ?? declared;\n const source: VersionResolution['source'] = lockfile\n ? 'lockfile'\n : installed\n ? 'installed'\n : declared\n ? 'declared'\n : 'unknown';\n return { served, source, lockfile, installed, declared, mismatch };\n}\n\nexport interface DriftNote {\n cataloged: string;\n installed?: string;\n drift: 'current' | 'behind' | 'ahead' | 'unknown';\n}\n\nexport function driftFor(root: string, entry: LibEntry): DriftNote {\n const installed = installedVersion(root, entry.name);\n if (!installed || entry.version === '*') return { cataloged: entry.version, installed, drift: 'unknown' };\n const norm = (v: string) => v.replace(/^[v^~>=<\\s]+/, '');\n const a = norm(entry.version);\n const b = norm(installed);\n if (a === b) return { cataloged: entry.version, installed, drift: 'current' };\n return { cataloged: entry.version, installed, drift: cmp(a, b) < 0 ? 'behind' : 'ahead' };\n}\n\nfunction cmp(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] || 0) - (pb[i] || 0);\n if (d) return d;\n }\n return 0;\n}\n\nexport interface AddOptions {\n root: string;\n name?: string;\n version?: string;\n /** Allow network for URL/llms.txt sources. */\n allowNetwork?: boolean;\n fetchImpl?: typeof globalThis.fetch;\n}\n\n/**\n * Recognise a git source. We treat a source as git when it is unambiguously\n * one: a `git+` scheme prefix, an `scp`-style `git@host:org/repo`, or a URL\n * ending in `.git`. A plain `https://…/docs` stays a website (no `.git`), so the\n * classification is deterministic and never surprises a URL ingest.\n * Returns the clone URL (with any `git+` prefix stripped), or null.\n */\nexport function parseGitSource(source: string): string | null {\n if (source.startsWith('git+')) return source.slice(4);\n if (/^git@[^:]+:/.test(source)) return source;\n if (/\\.git\\/?$/.test(source)) return source;\n return null;\n}\n\n/** Ingest docs for a library from a local path, a git repo, or (opt-in) a URL. */\nexport async function addLibrary(source: string, opts: AddOptions): Promise<LibEntry> {\n const { root } = opts;\n let content: string;\n let type: LibSource['type'] = 'local';\n\n const gitUrl = parseGitSource(source);\n if (gitUrl) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to clone ${source} without --online (offline by default)`);\n }\n content = cloneAndReadGit(gitUrl);\n type = 'git';\n } else if (/^https?:\\/\\//.test(source)) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to fetch ${source} without --online (offline by default)`);\n }\n const res = await (opts.fetchImpl ?? globalThis.fetch)(source);\n if (!res.ok) throw new Error(`fetch failed (${res.status}) for ${source}`);\n content = await res.text();\n type = source.endsWith('llms.txt') ? 'llms.txt' : source.endsWith('.json') ? 'openapi' : 'website';\n } else {\n const abs = path.resolve(root, source);\n if (!fs.existsSync(abs)) throw new Error(`source not found: ${source}`);\n content = readLocal(abs);\n type = 'local';\n }\n\n const name = opts.name ?? inferName(source);\n const id = libId(name);\n const version = opts.version ?? installedVersion(root, name) ?? '*';\n\n fs.mkdirSync(libDir(root), { recursive: true });\n const docFileAbs = path.join(libDir(root), `${id}.md`);\n fs.writeFileSync(docFileAbs, content);\n\n const entry: LibEntry = {\n id,\n name,\n version,\n source: { type, location: source },\n docFile: path.relative(root, docFileAbs).split(path.sep).join('/'),\n docHash: hashString(content),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n\n const catalog = loadCatalog(root);\n catalog.libraries[id] = entry;\n saveCatalog(root, catalog);\n return entry;\n}\n\nexport function readDoc(root: string, entry: LibEntry): string {\n const abs = path.resolve(root, entry.docFile);\n return fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : '';\n}\n\nexport interface LocalDocs {\n docs: string;\n version?: string;\n /** Cited on-disk source, relative to root (e.g. `node_modules/react/README.md`). */\n source: string;\n}\n\n/** Find an installed npm package directory, walking up for hoisted `node_modules`. */\nfunction npmPackageDir(root: string, name: string): string | undefined {\n let cur = root;\n for (let i = 0; i < 12; i++) {\n const dir = path.join(cur, 'node_modules', name);\n if (fs.existsSync(path.join(dir, 'package.json'))) return dir;\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return undefined;\n}\n\n/**\n * Local-first resolution ladder (VG-LIB-SUPERSET-PLAN A.2.3): when a library isn't\n * in the committed catalog, read its docs **from the\n * installed package on disk**, version-correct by construction and offline. Prefers\n * `llms.txt`, then the README, then the package.json description. First slice: npm\n * (`node_modules`); other ecosystems (site-packages, …) follow the same shape.\n */\nexport function localPackageDocs(root: string, name: string): LocalDocs | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n const version = resolveVersion(root, name).served;\n for (const f of ['llms.txt', 'README.md', 'README.mdx', 'README', 'readme.md']) {\n const p = path.join(dir, f);\n try {\n const docs = fs.readFileSync(p, 'utf8');\n if (docs.trim()) {\n return { docs, version, source: path.relative(root, p).split(path.sep).join('/') };\n }\n } catch {\n /* next candidate */\n }\n }\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as {\n description?: string;\n version?: string;\n };\n if (pkg.description?.trim()) {\n return {\n docs: `# ${name}\\n\\n${pkg.description}`,\n version: version ?? pkg.version,\n source: path.relative(root, path.join(dir, 'package.json')).split(path.sep).join('/'),\n };\n }\n } catch {\n /* ignore */\n }\n return undefined;\n}\n\n/** Locate a package's TypeScript declaration entry (`types`/`typings`, else conventional paths). */\nfunction dtsEntry(dir: string): string | undefined {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as {\n types?: string;\n typings?: string;\n };\n const rel = pkg.types ?? pkg.typings;\n if (typeof rel === 'string') {\n const p = path.join(dir, rel);\n if (fs.existsSync(p)) return p;\n }\n } catch {\n /* fall through to conventional paths */\n }\n for (const c of ['index.d.ts', 'dist/index.d.ts', 'lib/index.d.ts', 'types/index.d.ts']) {\n const p = path.join(dir, c);\n if (fs.existsSync(p)) return p;\n }\n return undefined;\n}\n\n/**\n * Extract exported declaration signatures from a `.d.ts` source. Declaration files\n * are body-less, so a brace-depth scanner is deterministic and robust: capture each\n * top-level `export …` statement from the keyword through its terminating `;` or\n * matching `}` (skipping `export {…}` / `export *` / `export default` re-exports).\n */\nexport function extractDtsApi(src: string, maxDecls = 200): string[] {\n const out: string[] = [];\n let depth = 0;\n let capture: string[] | null = null;\n for (const raw of src.split('\\n')) {\n const line = raw.trim();\n if (\n capture === null &&\n depth === 0 &&\n /^export\\b/.test(line) &&\n !/^export\\s+(\\{|\\*|default\\b|type\\s+\\{)/.test(line)\n ) {\n capture = [];\n }\n if (capture) capture.push(raw);\n for (const ch of raw) {\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n }\n if (capture && depth === 0 && /[;}]\\s*$/.test(line)) {\n out.push(capture.join('\\n').trim());\n capture = null;\n if (out.length >= maxDecls) break;\n }\n }\n return out;\n}\n\n/** Version-correct typed API surface (exported signatures) from a package's `.d.ts`, if present. */\nexport function localApiSurface(root: string, name: string): string | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n const dts = dtsEntry(dir);\n if (!dts) return undefined;\n let src: string;\n try {\n src = fs.readFileSync(dts, 'utf8');\n } catch {\n return undefined;\n }\n const decls = extractDtsApi(src);\n return decls.length ? decls.join('\\n\\n') : undefined;\n}\n\n/** Append the typed API surface (if any) as a fenced section — composed into served docs. */\nexport function withApiSurface(root: string, name: string, docs: string): string {\n const api = localApiSurface(root, name);\n return api ? `${docs}\\n\\n## API (types)\\n\\n\\`\\`\\`ts\\n${api}\\n\\`\\`\\`\\n` : docs;\n}\n\n/**\n * Shallow-clone a git repo to a temp dir, read its docs, then remove the clone.\n * Network-touching, so it only runs under `--online` (gated by the caller). The\n * clone is `--depth 1` (no history) and the temp dir is always cleaned up.\n */\nfunction cloneAndReadGit(url: string): string {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'vg-lib-git-'));\n try {\n execFileSync('git', ['clone', '--depth', '1', '--quiet', url, dir], {\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n } catch (err) {\n fs.rmSync(dir, { recursive: true, force: true });\n const detail = err instanceof Error && err.message ? `: ${err.message.split('\\n')[0]}` : '';\n throw new Error(`git clone failed for ${url}${detail}`);\n }\n try {\n return readGitDocs(dir);\n } finally {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/**\n * Read the documentation out of a cloned repo, deterministically: prefer a\n * top-level `docs/` directory, else the root README, else any top-level prose.\n */\nfunction readGitDocs(dir: string): string {\n const docsDir = path.join(dir, 'docs');\n if (fs.existsSync(docsDir) && fs.statSync(docsDir).isDirectory()) return readLocal(docsDir);\n const readme = ['README.md', 'README.mdx', 'README.txt', 'README.rst', 'readme.md']\n .map((f) => path.join(dir, f))\n .find((p) => fs.existsSync(p));\n if (readme) return fs.readFileSync(readme, 'utf8');\n return readLocal(dir);\n}\n\nfunction readLocal(abs: string): string {\n const stat = fs.statSync(abs);\n if (stat.isFile()) return fs.readFileSync(abs, 'utf8');\n // Directory: concatenate markdown/text files deterministically.\n const parts: string[] = [];\n const files = fs\n .readdirSync(abs, { withFileTypes: true })\n .filter((e) => e.isFile() && /\\.(md|mdx|txt|rst)$/i.test(e.name))\n .map((e) => e.name)\n .sort();\n for (const f of files) parts.push(`<!-- ${f} -->\\n${fs.readFileSync(path.join(abs, f), 'utf8')}`);\n return parts.join('\\n\\n');\n}\n\nfunction inferName(source: string): string {\n const cleaned = source.replace(/^git\\+/, '').replace(/\\.git\\/?$/i, '');\n const base = cleaned.replace(/\\/+$/, '').split(/[/:]/).pop() ?? cleaned;\n return base.replace(/\\.(md|mdx|txt|rst|json)$/i, '').replace(/^llms$/, 'docs');\n}\n","/**\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","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from './cache.js';\n\n/**\n * Usage-savings tracking (VG-DEVELOPMENT-PLAN §5) — local, privacy-safe, and\n * **opt-in**. We record *counts only* — never code, never the question text —\n * comparing the context tokens vg returned against a grep/read baseline estimate.\n * `vg savings` reports it with the assumptions shown; figures are labelled\n * estimates, never a hero number.\n *\n * Each entry also carries which path served the call (`source`: an MCP tool call\n * vs a `vg <subcommand>` CLI invocation) and, when known, a coarse `client` label\n * (the AI on the other end). That powers the command-vs-MCP split and the\n * per-client breakdown in `vg savings`, and is the basis for the opt-in\n * `vg serve --share-stats` upload (see ./stats-share.ts). Nothing here leaves the\n * machine unless the operator explicitly enables sharing.\n */\n\nconst LEDGER = 'savings.jsonl';\n// A conservative, documented estimate: tokens an agent reads per file it opens.\nexport const PER_FILE_TOKENS = 400;\n\n/** The tools whose grep/read token baseline the savings summary is computed from.\n * search_symbols belongs here: it is the direct grep replacement (the server\n * instructions steer agents to it INSTEAD of grep), yet it used to contribute\n * zero to the estimate — on search-heavy sessions most of the real saving went\n * uncounted. Its baseline is the same measure as query_graph's: the distinct\n * files its matches point at, at PER_FILE_TOKENS each. */\nexport const SAVINGS_TOOLS = new Set(['query_graph', 'get_node', 'search_symbols']);\n\n/**\n * How a navigation call reached the map:\n * - `mcp` — a tool call over the local `vg serve` MCP server;\n * - `cli` — a `vg <subcommand>` invocation that identified itself with `--client`.\n * Both are recorded into one ledger under a shared tool vocabulary (CLI\n * subcommands are normalised to their MCP tool names via CLI_TOOL_ALIASES), so\n * `(tool, source)` is the command-vs-MCP split and the token math stays unified.\n * Absent on ledger lines written before sources existed → read as `mcp` (the\n * only path that recorded then).\n */\nexport type Source = 'mcp' | 'cli';\n\n/**\n * Canonical tool name a CLI navigation subcommand maps to — the same vocabulary\n * the MCP tools use, so a `vg ask --client=claude` and an MCP `query_graph` call\n * land on one row distinguished only by `source`. A subcommand with no MCP twin\n * (e.g. `tree`) keeps its own name.\n */\nexport const CLI_TOOL_ALIASES: Readonly<Record<string, string>> = {\n ask: 'query_graph',\n show: 'get_node',\n impact: 'impact_of',\n path: 'find_path',\n hubs: 'list_hubs',\n areas: 'list_areas',\n tree: 'tree',\n};\n\n/**\n * Normalise a free-form client name (from `--client` or the MCP `initialize`\n * handshake) to a short, bounded, non-PII token: lowercase, `[a-z0-9._-]` only,\n * ≤ 40 chars. Never carries arbitrary user input into the ledger or an upload —\n * it is a coarse client label (e.g. `claude`, `cursor`, `cline`), not identity.\n * Returns `'unknown'` when nothing usable is provided.\n */\nexport function sanitizeClient(name: string | undefined | null): string {\n if (typeof name !== 'string') return 'unknown';\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40);\n return cleaned || 'unknown';\n}\n\n/**\n * Outcome of a recorded navigation call:\n * - `complete` — returned results, with nothing capped or paginated;\n * - `partial` — returned results, but more were available/truncated;\n * - `miss` — returned no result (no match, not-found, not-connected).\n */\nexport type Outcome = 'complete' | 'partial' | 'miss';\n\nexport interface SavingEntry {\n ts: number; // epoch ms (runtime ledger state, not part of any artifact)\n tool: string;\n // Optional for back-compat with ledger lines written before outcomes existed;\n // an absent value is read as `complete` (those lines only recorded hits).\n outcome?: Outcome;\n vgTokens: number;\n baselineTokens: number;\n // Optional for back-compat: absent `source` reads as `mcp`. `client` is a\n // sanitized coarse label (see sanitizeClient) or absent when unidentified.\n source?: Source;\n client?: string;\n // Wall time of the call, ms. Optional: absent on lines written before timing\n // existed (and on CLI-sourced lines) — absent means \"not measured\", never 0.\n ms?: number;\n}\n\n/**\n * Record a CLI navigation call (`vg <subcommand> --client=<ai>`) into the same\n * local ledger the MCP path uses. Only ever called when the caller passed\n * `--client` — i.e. an AI host explicitly identified itself — so a human's bare\n * `vg ask` still records nothing. Counts only; never the question or code.\n */\nexport function recordCliCall(\n root: string,\n entry: { tool: string; client?: string; outcome: Outcome; vgTokens?: number; baselineFiles?: number },\n now: number,\n): void {\n recordSaving(\n root,\n {\n tool: entry.tool,\n source: 'cli',\n client: sanitizeClient(entry.client),\n outcome: entry.outcome,\n vgTokens: entry.vgTokens ?? 0,\n baselineTokens: (entry.baselineFiles ?? 0) * PER_FILE_TOKENS,\n },\n now,\n );\n}\n\n/**\n * Absolute path of the local usage ledger for this repo. Exported so the serve\n * status display can tail it live (mcp/ledger-tail.ts) — the file itself stays\n * local-only (GUARDRAILS §3.4; upload is the separate opt-in stats-share path).\n */\nexport function savingsLedgerPath(root: string): string {\n return path.join(cacheDir(root), LEDGER);\n}\n\nfunction ledgerPath(root: string): string {\n return savingsLedgerPath(root);\n}\n\n/** Whether a savings ledger exists for this repo (i.e. `vg serve --savings` has recorded). */\nexport function savingsRecorded(root: string): boolean {\n return fs.existsSync(ledgerPath(root));\n}\n\n/**\n * Delete the recorded usage data for this repo: the ledger itself plus the\n * stats-share state that indexes into it (a byte offset into the ledger and the\n * random per-install id) — a stale offset against a fresh ledger would silently\n * skip new entries, and clearing \"my data\" should also reset the id. Everything\n * removed lives under `.vibgrate/cache/`; nothing else is touched. Returns\n * whether a ledger existed.\n */\nexport function clearSavings(root: string): boolean {\n const file = ledgerPath(root);\n const existed = fs.existsSync(file);\n fs.rmSync(file, { force: true });\n fs.rmSync(path.join(cacheDir(root), 'stats-share.json'), { force: true });\n return existed;\n}\n\nexport function recordSaving(root: string, entry: Omit<SavingEntry, 'ts'>, now: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const line = JSON.stringify({ ts: now, ...entry });\n fs.appendFileSync(ledgerPath(root), line + '\\n');\n } catch {\n /* never let telemetry break a tool call */\n }\n}\n\nexport interface SavingsReport {\n enabled: boolean;\n days: number;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n ratio: number;\n estCostVg: number;\n estCostBaseline: number;\n saved: number;\n rateLabel: string;\n}\n\n// Published-style input rate ($/1M tokens), shipped with the CLI. Labelled\n// estimate; the user can pass their own model rate.\nconst DEFAULT_RATE_PER_M = 3.0; // e.g. a mid-tier model input rate\nconst DEFAULT_RATE_LABEL = 'input @ $3/1M';\n\nexport function readSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): SavingsReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n let queries = 0;\n let vgTokens = 0;\n let baselineTokens = 0;\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n // The token-savings figures compare only the tools with a meaningful\n // grep/read baseline; the full per-command breakdown lives in readUsage.\n if (!SAVINGS_TOOLS.has(e.tool)) continue;\n queries++;\n vgTokens += e.vgTokens;\n baselineTokens += e.baselineTokens;\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const estCostVg = (vgTokens / 1e6) * ratePerM;\n const estCostBaseline = (baselineTokens / 1e6) * ratePerM;\n return {\n enabled: savingsRecorded(root),\n days,\n queries,\n vgTokens,\n baselineTokens,\n ratio: vgTokens > 0 ? Math.round((baselineTokens / vgTokens) * 100) / 100 : 0,\n estCostVg: round2(estCostVg),\n estCostBaseline: round2(estCostBaseline),\n saved: round2(estCostBaseline - estCostVg),\n rateLabel: DEFAULT_RATE_LABEL,\n };\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100;\n}\n\n/** Per-command usage stats over the ledger window (all recorded tools). */\nexport interface CommandStat {\n tool: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n /** (complete + partial) / calls, as a whole-number percentage. */\n successPct: number;\n /** Mean wall time over the calls that recorded one; null when none did. */\n avgMs: number | null;\n}\n\n/** Calls attributed to one dimension value (a source, or a client). */\nexport interface DimensionStat {\n key: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n successPct: number;\n}\n\nexport interface UsageReport {\n enabled: boolean;\n days: number;\n /** One row per tool used, ordered by call count (desc), then name. */\n commands: CommandStat[];\n /** The command-vs-MCP split: calls grouped by `source` (`cli` / `mcp`). */\n sources: DimensionStat[];\n /** Which AI is calling: calls grouped by coarse `client` label. */\n clients: DimensionStat[];\n /** Column sums across all commands. */\n totals: { calls: number; complete: number; partial: number; miss: number };\n /** The mean of the per-command success percentages (each command weighted equally). */\n avgSuccessPct: number;\n}\n\ninterface OutcomeCounts {\n complete: number;\n partial: number;\n miss: number;\n}\n\n/** Turn a name→outcome-count map into sorted DimensionStat rows. */\nfunction toDimensionStats(byKey: Map<string, OutcomeCounts>): DimensionStat[] {\n return [...byKey.entries()]\n .map(([key, r]) => {\n const calls = r.complete + r.partial + r.miss;\n return {\n key,\n calls,\n complete: r.complete,\n partial: r.partial,\n miss: r.miss,\n successPct: calls ? Math.round(((r.complete + r.partial) / calls) * 100) : 0,\n };\n })\n .sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n}\n\n/**\n * Per-command breakdown of recorded navigation calls: how often each tool was\n * used and how those calls resolved (complete / partial / miss), plus column\n * totals and the average success rate. Complements the token-savings summary —\n * this counts *every* recorded tool, not just the grep-baseline ones.\n */\nexport function readUsage(root: string, days: number, now: number): UsageReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byTool = new Map<string, OutcomeCounts>();\n const bySource = new Map<string, OutcomeCounts>();\n const byClient = new Map<string, OutcomeCounts>();\n // Per-tool timing over the entries that recorded a duration (older ledger\n // lines and CLI-sourced calls carry none — \"not measured\", never zero).\n const msByTool = new Map<string, { sum: number; n: number }>();\n const bump = (m: Map<string, OutcomeCounts>, key: string, outcome: Outcome): void => {\n const row = m.get(key) ?? { complete: 0, partial: 0, miss: 0 };\n row[outcome]++;\n m.set(key, row);\n };\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n const outcome: Outcome = e.outcome ?? 'complete';\n // Back-compat: lines written before these dims existed are MCP calls\n // from an unidentified client.\n bump(byTool, e.tool, outcome);\n bump(bySource, e.source ?? 'mcp', outcome);\n bump(byClient, e.client ?? 'unknown', outcome);\n if (typeof e.ms === 'number' && e.ms >= 0) {\n const timing = msByTool.get(e.tool) ?? { sum: 0, n: 0 };\n timing.sum += e.ms;\n timing.n++;\n msByTool.set(e.tool, timing);\n }\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const commands: CommandStat[] = toDimensionStats(byTool).map((d) => {\n const timing = msByTool.get(d.key);\n return {\n tool: d.key,\n calls: d.calls,\n complete: d.complete,\n partial: d.partial,\n miss: d.miss,\n successPct: d.successPct,\n avgMs: timing && timing.n > 0 ? Math.round(timing.sum / timing.n) : null,\n };\n });\n const totals = commands.reduce(\n (t, c) => ({\n calls: t.calls + c.calls,\n complete: t.complete + c.complete,\n partial: t.partial + c.partial,\n miss: t.miss + c.miss,\n }),\n { calls: 0, complete: 0, partial: 0, miss: 0 },\n );\n const avgSuccessPct = commands.length\n ? Math.round(commands.reduce((s, c) => s + c.successPct, 0) / commands.length)\n : 0;\n return {\n enabled: savingsRecorded(root),\n days,\n commands,\n sources: toDimensionStats(bySource),\n clients: toDimensionStats(byClient),\n totals,\n avgSuccessPct,\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { TOOLS, warmEmbedderInBackground } from './tools.js';\nimport { renderToolResult } from './response.js';\nimport { recordSaving, sanitizeClient, PER_FILE_TOKENS, SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The local `vg serve` MCP server. Self-contained and offline. Freshness is\n * two-layered, with no filesystem watcher (freshness only matters at the\n * moment of a query, so we check on read instead of watching):\n *\n * 1. **Hot reload** — `graph.json` is re-read whenever its mtime changes, so a\n * rebuild from ANY source (a foreground `vg`, another serve process, CI)\n * is picked up on the next tool call.\n * 2. **Auto-refresh** (default on) — each tool call runs a debounced, stat-only\n * freshness probe against the last build's snapshot; if the working tree\n * drifted, an incremental rebuild runs in-process (cross-process locked,\n * single-flight). The call waits for it up to a small budget — warm\n * incremental rebuilds land well inside it — and otherwise answers from\n * the current map while the rebuild finishes for the next call.\n *\n * Every tool remains read-only and auto-approvable; the refresh only rewrites\n * vg's own artifacts under `.vibgrate/`, never user code.\n */\n\n/** Min gap between freshness probes — bounds stat-walk cost under bursty tool calls. */\nconst PROBE_INTERVAL_MS = 2000;\n/** Ceiling for the self-tuned probe interval on very large repos. */\nconst MAX_PROBE_INTERVAL_MS = 30_000;\n/** Probe may consume at most ~1/PROBE_DUTY_FACTOR of serve wall-time (20 → ≤5%). */\nconst PROBE_DUTY_FACTOR = 20;\n/** How long a tool call waits for an in-flight refresh before answering from the current map. */\nconst REFRESH_BUDGET_MS = 5_000;\n/** After a refresh failure (e.g. read-only checkout), don't retry for this long. */\nconst FAILURE_COOLDOWN_MS = 60_000;\n\nexport interface ServeOptions {\n /** Record local, counts-only usage savings (opt-in). */\n savings?: boolean;\n /**\n * Periodically upload the counts-only ledger to Vibgrate (opt-in; off by\n * default). Implies recording. The upload itself is driven by the serve\n * command (see commands/serve.ts + engine/stats-share.ts); here it just also\n * turns recording on so there's something to send.\n */\n shareStats?: boolean;\n /** Air-gapped mode (no model downloads). */\n local?: boolean;\n /** Collapse repeat heavy relation lists within a session (opt-in). */\n dedup?: boolean;\n /** Auto-refresh the map when the working tree drifts (default true). */\n refresh?: boolean;\n /**\n * In-memory session stats behind the live `vg serve` status display. Always\n * safe to pass: nothing recorded here is persisted or uploaded — it dies with\n * the process (the opt-in ledger above is a separate concern).\n */\n stats?: SessionStats;\n}\n\nexport class GraphSource {\n private cachedMtimeMs = -1;\n private cached: VgGraph | null = null;\n private readonly root: string;\n private lastProbeAt = 0;\n private failedUntil = 0;\n private inflight: Promise<void> | null = null;\n /** Self-tuned: grows with measured probe cost so huge repos aren't penalized. */\n private probeIntervalMs = PROBE_INTERVAL_MS;\n\n constructor(\n readonly graphPath: string,\n private readonly refresh = false,\n /** Timing overrides (tests only). */\n private readonly tuning: { probeIntervalMs?: number; refreshBudgetMs?: number } = {},\n ) {\n // root = the directory containing .vibgrate/ (graphPath = root/.vibgrate/graph.json)\n this.root = path.dirname(path.dirname(graphPath));\n }\n\n /** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */\n async get(): Promise<VgGraph> {\n if (this.refresh) await this.maybeRefresh();\n const stat = fs.statSync(this.graphPath); // throws if missing → surfaced as tool error\n if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {\n this.cached = parseGraph(fs.readFileSync(this.graphPath, 'utf8'));\n this.cachedMtimeMs = stat.mtimeMs;\n }\n return this.cached;\n }\n\n /**\n * Debounced, single-flight refresh. Never throws — a refresh problem must\n * degrade to \"answer from the current map\", not break the tool call.\n */\n private async maybeRefresh(): Promise<void> {\n const now = Date.now();\n if (!this.inflight) {\n const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;\n if (now < this.failedUntil || now - this.lastProbeAt < interval) return;\n this.lastProbeAt = now;\n this.inflight = refreshIfStale(this.root)\n .then((r) => {\n if (r.status === 'error') this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n // Self-tune the probe cadence to the repo's actual size: when the\n // outcome was probe-only (no rebuild), its duration ≈ the stat-walk\n // cost, and the next probe is spaced so probing can never take more\n // than ~1/PROBE_DUTY_FACTOR of serve wall-time. Small repos stay at\n // the 2s floor; a 100k-file tree self-paces toward the 30s ceiling.\n if (r.status === 'fresh' || r.status === 'no-snapshot' || r.status === 'locked') {\n const cost = Date.now() - now;\n this.probeIntervalMs = Math.min(\n MAX_PROBE_INTERVAL_MS,\n Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR),\n );\n }\n })\n .catch(() => {\n this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n })\n .finally(() => {\n this.inflight = null;\n });\n }\n await Promise.race([this.inflight, sleep(this.tuning.refreshBudgetMs ?? REFRESH_BUDGET_MS)]);\n }\n}\n\nexport function createServer(source: GraphSource, opts: ServeOptions = {}): Server {\n const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;\n // Recording feeds both the local `vg savings` report and the opt-in upload, so\n // enabling either turns it on. Absent both, `vg serve` records nothing.\n const record = savings || shareStats;\n // root = the directory containing .vibgrate/ (graphPath = root/.vibgrate/graph.json)\n const root = path.dirname(path.dirname(source.graphPath));\n // Per-session memory of node ids whose full detail was already returned — the\n // basis for opt-in cross-call dedup (`--dedup`). Scoped to this server\n // instance so it never leaks across sessions. Node ids are content-addressed\n // (blake3 of content), so an edited node gets a new id and is never falsely\n // treated as already-seen — dedup is stale-safe by construction.\n const seen = new Set<string>();\n const server = new Server(\n { name: 'vg', version: VERSION },\n {\n capabilities: { tools: {} },\n // Routing guidance once at the server level (hosts that surface\n // `instructions` get it at zero per-step schema cost): the flashlight\n // vs the map.\n instructions:\n 'vg is a code map. Use search_symbols to find a known name or literal string fast — ' +\n 'a multi-word/quoted phrase runs a complete literal sweep and reports totalTextMatches, ' +\n 'so reach for it instead of grep even for plain-string \"find every occurrence\" lookups. ' +\n 'Use orient/query_graph for meaning: symptoms, relationships, and what-breaks-if. ' +\n 'Responses are concise by default; pass response_format:\"detailed\" only when a node proves load-bearing. ' +\n // Stop-discipline: the failure mode on a focused task is over-navigation\n // — one more query, one more get_node — which re-bills the whole context\n // every step. One good navigation call usually locates the code.\n 'Navigate as little as possible: one good search/query usually locates the code. ' +\n 'As soon as you have the file and line, read that file and make the edit — ' +\n 'do not call further graph tools unless the edit fails or the match was wrong. ' +\n // Library docs: position against web search (version-correct beats\n // SEO results), and give a stopping rule so a thin doc doesn't turn\n // into an open-ended search loop.\n 'For how-do-I-use-this-library questions call resolve_library once, then library_docs ' +\n 'with the returned targetId and a focused query: the docs are official and matched to ' +\n 'the version THIS project has installed (drift-annotated) — prefer them over web search ' +\n 'or training-data recall when they conflict. Skip them for language built-ins or APIs ' +\n 'already shown in context. If two library_docs calls have not surfaced the section you ' +\n 'need, read the package source under node_modules instead of searching again.',\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = TOOLS.find((t) => t.name === request.params.name);\n if (!tool) {\n return errorResult(`unknown tool \"${request.params.name}\"`);\n }\n let graph: VgGraph;\n try {\n graph = await source.get();\n } catch {\n return errorResult(\n 'no code map found. Run `vg` in the project to build .vibgrate/graph.json, then retry.',\n );\n }\n const startedAt = Date.now();\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n const result = await tool.handler(graph, args, { root, local, dedup, seen });\n const ms = Date.now() - startedAt;\n // Live, in-memory session stats for the serve status display — always on\n // when a serve process passed them (nothing leaves the process).\n stats?.record({ ...measureCall(tool.name, result), client: sanitizeClient(detectClient(server)), ms });\n // Opt-in, counts-only usage ledger: one entry per navigation call, with its\n // outcome, the grep-baseline token counts, and — so `vg savings` can show\n // the command-vs-MCP split and which AI is calling — the source (`mcp`) and\n // the client detected from the initialize handshake.\n if (record) recordUsage(root, tool.name, result, detectClient(server), ms);\n // Compact → clamp to the token ceiling → compact-serialise. See ./response.ts.\n return renderToolResult(result);\n } catch (err) {\n // A failed call still counts in the live display — as a miss, so the\n // operator sees trouble instead of a silently frozen dashboard.\n stats?.record({\n tool: tool.name,\n client: sanitizeClient(detectClient(server)),\n outcome: 'miss',\n ms: Date.now() - startedAt,\n vgTokens: 0,\n baselineTokens: 0,\n });\n return errorResult(`tool \"${tool.name}\" failed: ${(err as Error).message}`);\n }\n });\n\n return server;\n}\n\nexport async function serveStdio(graphPath: string, opts: ServeOptions = {}): Promise<void> {\n const source = new GraphSource(graphPath, opts.refresh !== false);\n const server = createServer(source, opts);\n // Start the semantic-model warm-up as soon as the server boots, so the first\n // orient/query_graph doesn't pay a cold download. Non-blocking: navigation\n // answers lexically until the model is ready, then upgrades to semantic.\n warmEmbedderInBackground(opts.local);\n await server.connect(new StdioServerTransport());\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.(); // never keep the server process alive just for the budget timer\n });\n}\n\n/**\n * Append a counts-only usage entry for a navigation call: which tool, how it\n * resolved (complete/partial/miss), and — for the grep-baseline tools — the\n * tokens vg spent vs the grep/read baseline it replaced.\n *\n * `vgTokens` is the size of the payload vg ACTUALLY returned — the rendered text\n * block the model receives and re-pays on every subsequent turn — measured with\n * the same token counter the budget uses. It is deliberately NOT read from a\n * `tokensEstimate` field: only query_graph's rarely-used *detailed* mode ever\n * set that (get_node never did), so the old code recorded nothing under normal\n * concise usage and `vg savings` always reported \"recording is off\".\n */\nexport function recordUsage(root: string, tool: string, result: unknown, client?: string, ms?: number): void {\n recordSaving(\n root,\n { ...measureCall(tool, result), source: 'mcp', client: sanitizeClient(client), ...(ms !== undefined ? { ms } : {}) },\n Date.now(),\n );\n}\n\n/**\n * Measure one tool call for the ledger and the live session stats: its outcome\n * plus — for the grep-baseline tools only — the context tokens vg returned and\n * the baseline they replaced (other tools report zeros, meaning \"no baseline\").\n */\nfunction measureCall(tool: string, result: unknown): { tool: string; outcome: Outcome; vgTokens: number; baselineTokens: number } {\n const outcome = classifyOutcome(result);\n let vgTokens = 0;\n let baselineTokens = 0;\n if (SAVINGS_TOOLS.has(tool) && result && typeof result === 'object') {\n vgTokens = countTokens(renderedText(renderToolResult(result)));\n // Grep/read baseline: ~PER_FILE_TOKENS per distinct file the answer points\n // at — the files a grep/read agent would have had to open to learn the same\n // thing. query_graph surfaces them as `matches[].file`; get_node as its own\n // `file` plus the files of the callers/callees it returned in one call.\n baselineTokens = referencedFiles(result).size * PER_FILE_TOKENS;\n }\n return { tool, outcome, vgTokens, baselineTokens };\n}\n\n/**\n * The coarse client label from the MCP `initialize` handshake, if the host sent\n * `clientInfo`. Read defensively — `getClientVersion()` exists on the SDK Server\n * once initialized, but we never want telemetry bookkeeping to throw. Returns\n * undefined when unknown (then sanitized to `'unknown'`).\n */\nfunction detectClient(server: Server): string | undefined {\n try {\n const info = (server as { getClientVersion?: () => { name?: string } | undefined }).getClientVersion?.();\n return typeof info?.name === 'string' ? info.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket a tool result into complete / partial / miss. A `miss` is an answer\n * that found nothing (no match, not-found, not-connected, or an empty listing);\n * a `partial` found results but capped or paginated some of them; everything\n * else is `complete`. Note that a legitimately empty `affected`/`covers` (e.g.\n * \"nothing depends on this\") is a successful answer, not a miss — only the\n * primary discovery signals below mark a miss.\n */\nfunction classifyOutcome(result: unknown): Outcome {\n if (Array.isArray(result)) return result.length === 0 ? 'miss' : 'complete';\n if (!result || typeof result !== 'object') return 'miss';\n const r = result as Record<string, unknown>;\n if (typeof r.error === 'string' && r.error) return 'miss'; // not_found / ambiguous / unresolved\n if (r.connected === false) return 'miss'; // find_path\n if (Array.isArray(r.matches) && r.matches.length === 0) return 'miss'; // query_graph / search_symbols\n return isPartial(r) ? 'partial' : 'complete';\n}\n\n/** True when a hit left results on the table: paginated, or a capped relation list. */\nfunction isPartial(r: Record<string, unknown>): boolean {\n if (r.moreAvailable === true) return true;\n if (r._truncated && typeof r._truncated === 'object') return true;\n // A `<name>Total` greater than the length of its sibling `<name>` array means\n // the array was capped (e.g. get_node's callsTotal vs the shown calls).\n for (const [key, value] of Object.entries(r)) {\n if (typeof value !== 'number' || !key.endsWith('Total')) continue;\n const base = key.slice(0, -'Total'.length);\n const shown = Array.isArray(r[base]) ? (r[base] as unknown[]).length : 0;\n if (value > shown) return true;\n }\n return false;\n}\n\n/** The text block of a rendered tool result — what the model is billed for. */\nfunction renderedText(rendered: CallToolResult): string {\n const block = rendered.content?.find((b) => b.type === 'text');\n return block && 'text' in block && typeof block.text === 'string' ? block.text : '';\n}\n\n/** Distinct files a navigation result points at (its grep/read baseline set). */\nfunction referencedFiles(result: unknown): Set<string> {\n const r = result as { file?: unknown; matches?: unknown; calls?: unknown; calledBy?: unknown };\n const files = new Set<string>();\n if (typeof r.file === 'string' && r.file) files.add(r.file);\n for (const m of asArray(r.matches)) {\n const f = (m as { file?: unknown }).file;\n if (typeof f === 'string' && f) files.add(f);\n }\n // get_node's calls/calledBy are qualified names of the form `path:symbol`; the\n // path prefix is the file a grep/read agent would open to inspect that edge.\n for (const name of [...asArray(r.calls), ...asArray(r.calledBy)]) {\n if (typeof name !== 'string') continue;\n const i = name.indexOf(':');\n if (i > 0) files.add(name.slice(0, i));\n }\n return files;\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\nfunction errorResult(message: string) {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n","import { serializeGraph } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { DepRecord } from './drift.js';\nimport type { LocalModel } from './models.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic exporters (VG-CLI-SPEC §4.2). One `vg export <file>` verb, format\n * inferred from the extension. Live graph-DB push is deliberately out (a file\n * import covers the same need offline). CycloneDX/SPDX power the SBOM/AI-BOM seam\n * (VG-LOCAL-MODELS §9.4).\n */\n\nexport type ExportFormat =\n | 'json'\n | 'ndjson'\n | 'graphml'\n | 'dot'\n | 'cypher'\n | 'sql'\n | 'md'\n | 'html'\n | 'cyclonedx'\n | 'spdx';\n\nexport function formatForExt(ext: string): ExportFormat | null {\n switch (ext.toLowerCase()) {\n case '.json':\n return 'json';\n case '.ndjson':\n return 'ndjson';\n case '.graphml':\n return 'graphml';\n case '.dot':\n case '.gv':\n return 'dot';\n case '.cypher':\n return 'cypher';\n case '.sql':\n return 'sql';\n case '.md':\n return 'md';\n case '.html':\n return 'html';\n default:\n return null;\n }\n}\n\nexport interface ExportContext {\n graph: VgGraph;\n deps?: DepRecord[];\n models?: LocalModel[];\n generatedAt: string;\n}\n\nexport function exportGraph(format: ExportFormat, ctx: ExportContext): string {\n switch (format) {\n case 'json':\n return serializeGraph(ctx.graph);\n case 'md':\n return renderReport(ctx.graph);\n case 'html':\n return renderHtml(ctx.graph);\n case 'ndjson':\n return ndjson(ctx.graph);\n case 'graphml':\n return graphml(ctx.graph);\n case 'dot':\n return dot(ctx.graph);\n case 'cypher':\n return cypher(ctx.graph);\n case 'sql':\n return sql(ctx);\n case 'cyclonedx':\n return cyclonedx(ctx);\n case 'spdx':\n return spdx(ctx);\n }\n}\n\nfunction ndjson(graph: VgGraph): string {\n // Facts stream if present, else the node stream — one JSON object per line.\n const rows = graph.facts && graph.facts.length ? graph.facts : graph.nodes;\n return rows.map((r) => JSON.stringify(r)).join('\\n') + '\\n';\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction graphml(graph: VgGraph): string {\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">');\n lines.push(' <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>');\n lines.push(' <key id=\"kind\" for=\"node\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <key id=\"file\" for=\"node\" attr.name=\"file\" attr.type=\"string\"/>');\n lines.push(' <key id=\"ekind\" for=\"edge\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <graph edgedefault=\"directed\">');\n for (const n of graph.nodes) {\n lines.push(` <node id=\"${esc(n.id)}\"><data key=\"name\">${esc(n.qualifiedName)}</data><data key=\"kind\">${esc(n.kind)}</data><data key=\"file\">${esc(n.file)}</data></node>`);\n }\n for (const e of graph.edges) {\n lines.push(` <edge source=\"${esc(e.src)}\" target=\"${esc(e.dst)}\"><data key=\"ekind\">${esc(e.kind)}</data></edge>`);\n }\n lines.push(' </graph>');\n lines.push('</graphml>');\n return lines.join('\\n') + '\\n';\n}\n\nfunction dot(graph: VgGraph): string {\n const lines: string[] = ['digraph vg {'];\n for (const n of graph.nodes) lines.push(` \"${n.id}\" [label=\"${dotEsc(n.qualifiedName)}\"];`);\n for (const e of graph.edges) lines.push(` \"${e.src}\" -> \"${e.dst}\" [label=\"${e.kind}\"];`);\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\nfunction dotEsc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction cypher(graph: VgGraph): string {\n const lines: string[] = [];\n for (const n of graph.nodes) {\n lines.push(\n `CREATE (:\\`${cypherLabel(n.kind)}\\` {id:${q(n.id)}, name:${q(n.qualifiedName)}, file:${q(n.file)}});`,\n );\n }\n for (const e of graph.edges) {\n lines.push(\n `MATCH (a {id:${q(e.src)}}),(b {id:${q(e.dst)}}) CREATE (a)-[:\\`${cypherLabel(e.kind)}\\`]->(b);`,\n );\n }\n return lines.join('\\n') + '\\n';\n}\nfunction cypherLabel(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, '_');\n}\nfunction q(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Portable SQL fact-DB (VG-CLI-SPEC §4.2, agent-consumption). Emits deterministic\n * DDL + INSERT text — NOT a native driver — that loads identically into BOTH\n * sqlite3 and duckdb (`sqlite3 map.db < map.sql` / `duckdb map.db < map.sql`).\n * Text keeps the CLI dependency-free, offline, and byte-diffable; an identical\n * graph yields identical bytes. An agent can then run e.g.\n * SELECT src, dst FROM edges WHERE epistemic = 'observed' AND confidence >= 0.9;\n * Determinism: single transaction, `CREATE TABLE IF NOT EXISTS`, rows emitted in\n * the graph's own (already-sorted) array order, single quotes doubled, NULL for\n * absent optionals, booleans as 0/1, and no timestamp but the graph's generatedAt.\n */\nfunction sql(ctx: ExportContext): string {\n const graph = ctx.graph;\n const lines: string[] = [];\n lines.push('BEGIN;');\n\n // meta — provenance / toolchain fingerprint (key/value; agent can read the corpus hash).\n lines.push('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);');\n const meta: [string, string | null][] = [\n ['schemaVersion', graph.schemaVersion],\n ['generatedAt', ctx.generatedAt],\n ['corpusHash', graph.provenance.corpusHash],\n ['tool', graph.provenance.tool],\n ['toolVersion', graph.provenance.version],\n ['resolver', graph.provenance.resolver.join(',')],\n ['fingerprint', graph.provenance.toolchain?.fingerprint ?? null],\n ];\n for (const [k, v] of meta) lines.push(`INSERT INTO meta VALUES (${sqlStr(k)}, ${sqlStr(v)});`);\n\n // nodes\n lines.push(\n 'CREATE TABLE IF NOT EXISTS nodes (id TEXT PRIMARY KEY, kind TEXT, name TEXT, qualified_name TEXT, file TEXT, span_start INTEGER, span_end INTEGER, lang TEXT, visibility TEXT, signature TEXT, importance REAL, area INTEGER, is_hub INTEGER, tested INTEGER, coverage REAL);',\n );\n for (const n of graph.nodes) {\n lines.push(\n `INSERT INTO nodes VALUES (${sqlStr(n.id)}, ${sqlStr(n.kind)}, ${sqlStr(n.name)}, ${sqlStr(n.qualifiedName)}, ${sqlStr(n.file)}, ${sqlNum(n.span.start)}, ${sqlNum(n.span.end)}, ${sqlStr(n.lang)}, ${sqlStr(n.visibility)}, ${sqlStr(n.signature)}, ${sqlNum(n.importance)}, ${sqlNum(n.area)}, ${sqlBool(n.isHub)}, ${sqlBool(n.tested)}, ${sqlNum(n.coverage)});`,\n );\n }\n\n // edges — the epistemic column is the point: SELECT ... WHERE epistemic='observed'.\n lines.push(\n 'CREATE TABLE IF NOT EXISTS edges (id TEXT PRIMARY KEY, kind TEXT, src TEXT, dst TEXT, resolution TEXT, confidence REAL, epistemic TEXT, surprise REAL, \"count\" INTEGER);',\n );\n for (const e of graph.edges) {\n lines.push(\n `INSERT INTO edges VALUES (${sqlStr(e.id)}, ${sqlStr(e.kind)}, ${sqlStr(e.src)}, ${sqlStr(e.dst)}, ${sqlStr(e.resolution)}, ${sqlNum(e.confidence)}, ${sqlStr(e.epistemic)}, ${sqlNum(e.surprise)}, ${sqlNum(e.count)});`,\n );\n }\n\n // areas (+ members)\n lines.push('CREATE TABLE IF NOT EXISTS areas (id INTEGER PRIMARY KEY, label TEXT, size INTEGER, cohesion REAL, external_edges INTEGER);');\n lines.push('CREATE TABLE IF NOT EXISTS area_members (area_id INTEGER, node_id TEXT);');\n for (const a of graph.areas) {\n lines.push(`INSERT INTO areas VALUES (${sqlNum(a.id)}, ${sqlStr(a.label)}, ${sqlNum(a.size)}, ${sqlNum(a.cohesion)}, ${sqlNum(a.externalEdges)});`);\n for (const m of a.members) lines.push(`INSERT INTO area_members VALUES (${sqlNum(a.id)}, ${sqlStr(m)});`);\n }\n\n // facts (+ subjects, evidence) — only with a --deep build.\n if (graph.facts && graph.facts.length) {\n lines.push('CREATE TABLE IF NOT EXISTS facts (id TEXT PRIMARY KEY, kind TEXT, predicate_json TEXT, derived_by TEXT, confidence TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_subjects (fact_id TEXT, node_id TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_evidence (fact_id TEXT, file TEXT, span_start INTEGER, span_end INTEGER);');\n for (const f of graph.facts) {\n lines.push(`INSERT INTO facts VALUES (${sqlStr(f.id)}, ${sqlStr(f.kind)}, ${sqlStr(JSON.stringify(f.predicate))}, ${sqlStr(f.derivedBy)}, ${sqlStr(f.confidence)});`);\n for (const s of f.subjectIds) lines.push(`INSERT INTO fact_subjects VALUES (${sqlStr(f.id)}, ${sqlStr(s)});`);\n for (const ev of f.evidence) lines.push(`INSERT INTO fact_evidence VALUES (${sqlStr(f.id)}, ${sqlStr(ev.file)}, ${sqlNum(ev.span.start)}, ${sqlNum(ev.span.end)});`);\n }\n }\n\n lines.push('COMMIT;');\n return lines.join('\\n') + '\\n';\n}\n\n/** SQL string literal (single quotes doubled) or NULL for absent values. */\nfunction sqlStr(v: string | null | undefined): string {\n if (v == null) return 'NULL';\n return `'${v.replace(/'/g, \"''\")}'`;\n}\n/** Numeric literal or NULL for absent values. */\nfunction sqlNum(v: number | null | undefined): string {\n return v == null || !Number.isFinite(v) ? 'NULL' : String(v);\n}\n/** Boolean as 0/1, NULL when unknown (e.g. an unanalyzable node's `tested`). */\nfunction sqlBool(v: boolean | null | undefined): string {\n return v == null ? 'NULL' : v ? '1' : '0';\n}\n\nfunction cyclonedx(ctx: ExportContext): string {\n // CycloneDX 1.6 JSON — dependencies as library components + local models as\n // machine-learning-model components (AI-BOM). Deterministic ordering; no\n // timestamps beyond the pinned generatedAt.\n const components: unknown[] = [];\n for (const d of ctx.deps ?? []) {\n components.push({\n type: 'library',\n name: d.name,\n version: d.installed ?? d.declared,\n purl: d.ecosystem === 'npm' ? `pkg:npm/${d.name}@${d.installed ?? ''}` : undefined,\n });\n }\n for (const m of ctx.models ?? []) {\n components.push({ type: 'machine-learning-model', name: m.name, properties: [{ name: 'vg:runtime', value: m.runtime }] });\n }\n const bom = {\n bomFormat: 'CycloneDX',\n specVersion: '1.6',\n metadata: { timestamp: ctx.generatedAt, tools: [{ name: 'vg', version: ctx.graph.provenance.version }] },\n components,\n };\n return JSON.stringify(bom, null, 2) + '\\n';\n}\n\nfunction spdx(ctx: ExportContext): string {\n const packages = (ctx.deps ?? []).map((d) => ({\n SPDXID: `SPDXRef-Package-${cypherLabel(d.name)}`,\n name: d.name,\n versionInfo: d.installed ?? d.declared,\n downloadLocation: 'NOASSERTION',\n }));\n const doc = {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: 'vg-sbom',\n creationInfo: { created: ctx.generatedAt, creators: [`Tool: vg-${ctx.graph.provenance.version}`] },\n packages,\n };\n return JSON.stringify(doc, null, 2) + '\\n';\n}\n"]}
|