@vibgrate/cli 2026.727.1 → 2026.727.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/DOCS.md +21 -18
- package/README.md +2 -2
- package/dist/baseline-ATM5MXBZ.js +8 -0
- package/dist/{baseline-K7YBFKZI.js.map → baseline-ATM5MXBZ.js.map} +1 -1
- package/dist/{chunk-OXQNQW5J.js → chunk-2VFWXNS5.js} +4 -4
- package/dist/{chunk-OXQNQW5J.js.map → chunk-2VFWXNS5.js.map} +1 -1
- package/dist/{chunk-VXGV6NTD.js → chunk-3V24O47U.js} +11 -9
- package/dist/chunk-3V24O47U.js.map +1 -0
- package/dist/{chunk-C4CKTAZP.js → chunk-6JIKUDWM.js} +4 -4
- package/dist/chunk-6JIKUDWM.js.map +1 -0
- package/dist/{chunk-6IOQJGFT.js → chunk-6UK6QPTR.js} +96 -140
- package/dist/chunk-6UK6QPTR.js.map +1 -0
- package/dist/chunk-6UQMXIAG.js +122 -0
- package/dist/chunk-6UQMXIAG.js.map +1 -0
- package/dist/{chunk-SZLF66FJ.js → chunk-77LYGXBI.js} +5 -5
- package/dist/{chunk-SZLF66FJ.js.map → chunk-77LYGXBI.js.map} +1 -1
- package/dist/{chunk-KHJO4D5N.js → chunk-7N4Y3E47.js} +2 -2
- package/dist/{chunk-KHJO4D5N.js.map → chunk-7N4Y3E47.js.map} +1 -1
- package/dist/{chunk-65MEOA4E.js → chunk-AVQSHIJ5.js} +22 -18
- package/dist/chunk-AVQSHIJ5.js.map +1 -0
- package/dist/chunk-B3YUO3NW.js +469 -0
- package/dist/chunk-B3YUO3NW.js.map +1 -0
- package/dist/{chunk-YDAT7LD2.js → chunk-C66GOHYB.js} +18 -10
- package/dist/chunk-C66GOHYB.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/{chunk-HYZVHJ3Q.js → chunk-FFWGT55D.js} +4 -4
- package/dist/{chunk-HYZVHJ3Q.js.map → chunk-FFWGT55D.js.map} +1 -1
- package/dist/{chunk-4CQ3MGNN.js → chunk-HK3AWUXH.js} +3 -3
- package/dist/{chunk-4CQ3MGNN.js.map → chunk-HK3AWUXH.js.map} +1 -1
- package/dist/{chunk-S6CYDZEW.js → chunk-MAY5HLDH.js} +772 -200
- package/dist/chunk-MAY5HLDH.js.map +1 -0
- package/dist/{chunk-7JHPQ6WF.js → chunk-OFUC6RYN.js} +3 -3
- package/dist/{chunk-7JHPQ6WF.js.map → chunk-OFUC6RYN.js.map} +1 -1
- package/dist/{chunk-3Q7QBWFW.js → chunk-ON25BX6T.js} +9 -3
- package/dist/chunk-ON25BX6T.js.map +1 -0
- package/dist/{chunk-JZYGEZTU.js → chunk-XPJZTSY7.js} +3 -3
- package/dist/{chunk-JZYGEZTU.js.map → chunk-XPJZTSY7.js.map} +1 -1
- package/dist/{chunk-WLETRGAC.js → chunk-Y23HMSWU.js} +11 -11
- package/dist/{chunk-WLETRGAC.js.map → chunk-Y23HMSWU.js.map} +1 -1
- package/dist/{chunk-3BVSDMHV.js → chunk-Z7GP7XTJ.js} +8 -8
- package/dist/{chunk-3BVSDMHV.js.map → chunk-Z7GP7XTJ.js.map} +1 -1
- package/dist/{chunk-EDAAG7BL.js → chunk-ZBTY6VV4.js} +4 -3
- package/dist/chunk-ZBTY6VV4.js.map +1 -0
- package/dist/chunk-ZKNB4YH4.js +102 -0
- package/dist/chunk-ZKNB4YH4.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +475 -404
- package/dist/cli.js.map +1 -1
- package/dist/{execution-env-3BN7Z737.js → execution-env-ZU45JZ4G.js} +3 -2
- package/dist/{execution-env-3BN7Z737.js.map → execution-env-ZU45JZ4G.js.map} +1 -1
- package/dist/{federation-EPZDUWCK.js → federation-SZWZIFZ7.js} +3 -2
- package/dist/{federation-EPZDUWCK.js.map → federation-SZWZIFZ7.js.map} +1 -1
- package/dist/{fs-IPY4FJKH.js → fs-B5HZ2MIU.js} +3 -2
- package/dist/fs-B5HZ2MIU.js.map +1 -0
- package/dist/{fs-KCABDURV.js → fs-O5IQYXHO.js} +3 -2
- package/dist/fs-O5IQYXHO.js.map +1 -0
- package/dist/{git-ref-HPRLUFFW.js → git-ref-XDXB6JP5.js} +3 -2
- package/dist/{git-ref-HPRLUFFW.js.map → git-ref-XDXB6JP5.js.map} +1 -1
- package/dist/graph-backend-UTOL3SHE.js +11 -0
- package/dist/{graph-backend-ZMSYOZMW.js.map → graph-backend-UTOL3SHE.js.map} +1 -1
- package/dist/index.d.ts +53 -17
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/{interactive-ICL7D7LO.js → interactive-INGJNSON.js} +23 -22
- package/dist/interactive-INGJNSON.js.map +1 -0
- package/dist/{llm-host-2RAYQSDQ.js → llm-host-7GWDO6IX.js} +3 -2
- package/dist/{llm-host-2RAYQSDQ.js.map → llm-host-7GWDO6IX.js.map} +1 -1
- package/dist/load-QPOWQD7C.js +8 -0
- package/dist/{load-OHVKDX4R.js.map → load-QPOWQD7C.js.map} +1 -1
- package/dist/local-runtime-5O2NN3GA.js +5 -0
- package/dist/{local-runtime-OJFLX2HI.js.map → local-runtime-5O2NN3GA.js.map} +1 -1
- package/dist/mcp-tools-I7JK3S2M.js +4 -0
- package/dist/{mcp-tools-I6PME3AV.js.map → mcp-tools-I7JK3S2M.js.map} +1 -1
- package/dist/{model-execution-profile-MQ2QCP24.js → model-execution-profile-TFBKCNJG.js} +3 -2
- package/dist/{model-execution-profile-MQ2QCP24.js.map → model-execution-profile-TFBKCNJG.js.map} +1 -1
- package/dist/{model-orchestrator-FFTZI3U2.js → model-orchestrator-TVONAUPS.js} +5 -4
- package/dist/{model-orchestrator-FFTZI3U2.js.map → model-orchestrator-TVONAUPS.js.map} +1 -1
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +2 -1
- package/dist/parse-worker.js.map +1 -1
- package/dist/{paths-MCH75O3G.js → paths-2RAH3GME.js} +3 -2
- package/dist/{paths-MCH75O3G.js.map → paths-2RAH3GME.js.map} +1 -1
- package/dist/{resolve-gguf-4UPIGPEE.js → resolve-gguf-VPL4YQ6J.js} +3 -2
- package/dist/{resolve-gguf-4UPIGPEE.js.map → resolve-gguf-VPL4YQ6J.js.map} +1 -1
- package/dist/runtime-session-4AMZIAAG.js +18 -0
- package/dist/{runtime-session-IDU5BDUJ.js.map → runtime-session-4AMZIAAG.js.map} +1 -1
- package/dist/session-M72522AP.js +11 -0
- package/dist/{session-L2OSDRPI.js.map → session-M72522AP.js.map} +1 -1
- package/dist/session-store-WFBX7HXL.js +4 -0
- package/dist/{session-store-W5RZZHA3.js.map → session-store-WFBX7HXL.js.map} +1 -1
- package/dist/sql-extract-JELDZA6W.js +81 -0
- package/dist/sql-extract-JELDZA6W.js.map +1 -0
- package/dist/{stream-json-F74W5FCK.js → stream-json-6ZBUA2L3.js} +11 -10
- package/dist/stream-json-6ZBUA2L3.js.map +1 -0
- package/dist/{types-ZMg1mSuu.d.ts → types-DLH-Ritr.d.ts} +22 -1
- package/dist/ui-Q6DJ3GCU.js +5 -0
- package/dist/ui-Q6DJ3GCU.js.map +1 -0
- package/dist/{vgd-EGBQD7BW.js → vgd-CVLKBS7K.js} +7 -6
- package/dist/vgd-CVLKBS7K.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-K7YBFKZI.js +0 -7
- package/dist/chunk-3Q7QBWFW.js.map +0 -1
- package/dist/chunk-5Q54GEHM.js +0 -29
- package/dist/chunk-5Q54GEHM.js.map +0 -1
- package/dist/chunk-65MEOA4E.js.map +0 -1
- package/dist/chunk-6IOQJGFT.js.map +0 -1
- package/dist/chunk-C4CKTAZP.js.map +0 -1
- package/dist/chunk-EDAAG7BL.js.map +0 -1
- package/dist/chunk-EDBV33B7.js +0 -57
- package/dist/chunk-EDBV33B7.js.map +0 -1
- package/dist/chunk-HABUT7HW.js +0 -233
- package/dist/chunk-HABUT7HW.js.map +0 -1
- package/dist/chunk-S6CYDZEW.js.map +0 -1
- package/dist/chunk-VXGV6NTD.js.map +0 -1
- package/dist/chunk-YDAT7LD2.js.map +0 -1
- package/dist/fs-IPY4FJKH.js.map +0 -1
- package/dist/fs-KCABDURV.js.map +0 -1
- package/dist/graph-backend-ZMSYOZMW.js +0 -10
- package/dist/interactive-ICL7D7LO.js.map +0 -1
- package/dist/load-OHVKDX4R.js +0 -7
- package/dist/local-runtime-OJFLX2HI.js +0 -4
- package/dist/mcp-tools-I6PME3AV.js +0 -3
- package/dist/runtime-session-IDU5BDUJ.js +0 -17
- package/dist/session-L2OSDRPI.js +0 -10
- package/dist/session-store-W5RZZHA3.js +0 -3
- package/dist/stream-json-F74W5FCK.js.map +0 -1
- package/dist/ui-HOVOPWMX.js +0 -4
- package/dist/ui-HOVOPWMX.js.map +0 -1
- package/dist/vgd-EGBQD7BW.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/module-resolver.ts","../src/engine/ids.ts","../src/engine/tests.ts","../src/engine/drift.ts","../src/engine/lockfile.ts","../src/engine/lib.ts","../src/engine/resolve.ts"],"names":["path","fs","fs2","path2","fs3","path3","resolve","path5","mod","sep"],"mappings":"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","file":"chunk-C4CKTAZP.js","sourcesContent":["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","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 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","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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/savings.ts","../src/code/context.ts","../src/code/capsule.ts"],"names":["estimateTokens","normalize"],"mappings":"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","file":"chunk-EDAAG7BL.js","sourcesContent":["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 // The model that made the call, for per-model savings auditing. `provider` is\n // a coarse provider label (e.g. `anthropic`, `ollama`), `model` the sanitized\n // model slug. VG Code sets both so `vg savings` can break usage down per model.\n // Absent on lines from callers that don't identify a model.\n provider?: string;\n model?: 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 * Normalise a model slug to a bounded, non-PII token — like {@link sanitizeClient}\n * but keeping the `/` and `:` that model ids use (`anthropic/claude-3.5-sonnet`,\n * `qwen2.5-coder:7b`). Returns undefined when nothing usable is given.\n */\nexport function sanitizeModelId(name: string | undefined | null): string | undefined {\n if (typeof name !== 'string') return undefined;\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._:/-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60);\n return cleaned || undefined;\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; provider?: string; model?: 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 provider: entry.provider ? sanitizeClient(entry.provider) : undefined,\n model: sanitizeModelId(entry.model),\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/** Token + cost savings attributed to one model (VG Code per-model auditing). */\nexport interface ModelSaving {\n /** `provider/model`, the ledger's per-model key. */\n key: string;\n provider: string;\n model: string;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n saved: number;\n}\n\n/**\n * Per-model breakdown of the token-savings figures — the basis of \"full savings\n * auditing per model\". Only entries that carry a `model` and are savings-baseline\n * tools contribute, so it lines up with the headline `readSavings` totals.\n * Sorted by dollars saved (desc), then key.\n */\nexport function readModelSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): ModelSaving[] {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byModel = new Map<string, { provider: string; model: string; queries: number; vg: number; base: number }>();\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 || !e.model || !SAVINGS_TOOLS.has(e.tool)) continue;\n const provider = e.provider ?? 'unknown';\n const key = `${provider}/${e.model}`;\n const row = byModel.get(key) ?? { provider, model: e.model, queries: 0, vg: 0, base: 0 };\n row.queries++;\n row.vg += e.vgTokens;\n row.base += e.baselineTokens;\n byModel.set(key, row);\n } catch {\n /* skip corrupt line */\n }\n }\n }\n return [...byModel.entries()]\n .map(([key, r]) => ({\n key,\n provider: r.provider,\n model: r.model,\n queries: r.queries,\n vgTokens: r.vg,\n baselineTokens: r.base,\n saved: round2(((r.base - r.vg) / 1e6) * ratePerM),\n }))\n .sort((a, b) => b.saved - a.saved || a.key.localeCompare(b.key));\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","/**\n * Graph-grounded context assembly for `vg code` (VG-CLI-CODE §3).\n *\n * A generic coding agent starts blind and reconstructs structure by grepping and\n * reading whole files — which is exactly what blows the context window and\n * degrades the model. This module instead uses the deterministic code graph to\n * hand the planner a *small, high-signal, budget-bounded* context: the symbols\n * most relevant to the instruction, their immediate relations, the blast radius\n * of changing them, and any declared facts (hard constraints) that must not be\n * dropped by later compaction. Deterministic given a graph + instruction, so it\n * is fully offline-testable and benchmarkable.\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { indexFor } from '../engine/relations.js';\nimport { impactOf } from '../engine/impact.js';\nimport type { CodeContext } from './types.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\nexport interface BuildContextOptions {\n /** Approx token budget for the rendered block (default 3000). */\n budget?: number;\n /** How many retrieval seeds to expand (default 8). */\n seeds?: number;\n /** Impact BFS depth for the blast radius (default 2). */\n impactDepth?: number;\n /** Restrict the edit surface to these files (from `--file`), if given. */\n files?: string[];\n}\n\n/**\n * Build the context block for a coding instruction. The ordering is\n * cache-stable by design (see router.ts): the invariant, repo-derived material\n * (facts, symbols, relations) comes first and the volatile instruction is\n * echoed last, so a provider's prompt cache can reuse the stable prefix across\n * turns.\n */\nexport function buildCodeContext(graph: VgGraph, instruction: string, options: BuildContextOptions = {}): CodeContext {\n const budget = options.budget ?? 3000;\n const seedLimit = options.seeds ?? 8;\n const impactDepth = options.impactDepth ?? 2;\n const index = indexFor(graph);\n\n // Retrieval seeds: reuse the deterministic lexical/structural retrieval that\n // backs `vg ask`. When `--file` narrows the surface, keep only seeds in those\n // files (but still let impact reach outside them, so the review is honest).\n const q = queryGraph(graph, instruction, { budget: Math.floor(budget * 0.6), limit: seedLimit * 2 });\n let seeds = q.matches.map((m) => ({ node: m.node, why: m.why }));\n if (options.files && options.files.length) {\n const set = new Set(options.files.map(normalize));\n const inScope = seeds.filter((s) => set.has(normalize(s.node.file)));\n // If nothing matched inside the named files, keep the best global seeds but\n // still steer target files to what the caller asked for.\n if (inScope.length) seeds = inScope;\n }\n seeds = seeds.slice(0, seedLimit);\n\n // Blast radius: who depends on the seeds. This is the impact-aware review\n // signal — an edit to a hub is riskier and the context says so.\n const impacted = new Map<string, { node: GraphNode; via: string }>();\n for (const s of seeds) {\n const impact = impactOf(graph, s.node.id, { depth: impactDepth });\n for (const item of impact.affected.slice(0, 6)) {\n const node = index.node(item.id);\n if (node && !impacted.has(node.id)) impacted.set(node.id, { node, via: s.node.qualifiedName });\n }\n }\n\n // Target files: the seed files (or the explicit --file set), stable order.\n const targetFiles = options.files?.length\n ? [...new Set(options.files.map(normalize))].sort()\n : [...new Set(seeds.map((s) => s.node.file))].sort();\n\n // Pinned facts: declared invariants/contracts that touch the seeds. These are\n // hard constraints; they are surfaced explicitly and never summarized away.\n const seedIds = new Set(seeds.map((s) => s.node.id));\n const pinnedFacts = pinnedFactsFor(graph, seedIds);\n\n const rendered = render(instruction, seeds, [...impacted.values()], targetFiles, pinnedFacts, index, budget);\n return {\n instruction,\n seeds,\n targetFiles,\n impacted: [...impacted.values()],\n pinnedFacts,\n rendered,\n tokensEstimate: estimateTokens(rendered),\n };\n}\n\nfunction pinnedFactsFor(graph: VgGraph, seedIds: Set<string>): string[] {\n if (!graph.facts?.length) return [];\n const out: string[] = [];\n for (const f of graph.facts) {\n if (f.kind === 'characterization') continue; // keep hard constraints only\n if (!f.subjectIds.some((id) => seedIds.has(id))) continue;\n const subjects = f.subjectIds\n .map((id) => graph.nodes.find((n) => n.id === id)?.qualifiedName ?? id)\n .join(', ');\n out.push(`${f.kind}: ${subjects} — ${JSON.stringify(f.predicate)}`);\n }\n return out.sort().slice(0, 12);\n}\n\nfunction render(\n instruction: string,\n seeds: { node: GraphNode; why: string }[],\n impacted: { node: GraphNode; via: string }[],\n targetFiles: string[],\n pinnedFacts: string[],\n index: ReturnType<typeof indexFor>,\n budget: number,\n): string {\n const lines: string[] = [];\n lines.push('# Repository context (from the deterministic code graph)');\n lines.push('');\n\n if (pinnedFacts.length) {\n lines.push('## Hard constraints (do not violate)');\n for (const f of pinnedFacts) lines.push(`- ${f}`);\n lines.push('');\n }\n\n lines.push('## Relevant symbols');\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`### ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start}-${node.span.end})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = uniqueNames(index.callees(node.id).map((x) => x.node.qualifiedName)).slice(0, 6);\n const callers = uniqueNames(index.callers(node.id).map((x) => x.node.qualifiedName)).slice(0, 6);\n if (callees.length) block.push(`calls: ${callees.join(', ')}`);\n if (callers.length) block.push(`called by: ${callers.join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)}${node.isHub ? ' · hub (high blast radius)' : ''} · ${why}`);\n block.push('');\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 3) break;\n lines.push(...block);\n }\n\n if (impacted.length) {\n lines.push('## Blast radius (would be affected by a change here)');\n for (const { node, via } of impacted.slice(0, 10)) {\n lines.push(`- ${node.qualifiedName} (${node.file}:${node.span.start}) — depends on ${via}`);\n }\n lines.push('');\n }\n\n lines.push('## Files in scope for this edit');\n for (const f of targetFiles) lines.push(`- ${f}`);\n lines.push('');\n\n lines.push('## Task');\n lines.push(instruction);\n return lines.join('\\n');\n}\n\nfunction uniqueNames(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n","/**\n * Source-bearing Task Capsule compiler (Fusion Runtime Phase 0).\n *\n * Today's {@link buildCodeContext} pays for graph metadata, then the model still\n * calls `read_file` — double payment. This module compiles a Task Capsule that\n * includes exact source ranges (from Tree-sitter spans already on graph nodes)\n * so the first inference can solve without navigation tool calls (ZNS@1 path).\n *\n * Deterministic given (graph, instruction, file contents, options). Injectable\n * `readFile` keeps unit tests offline and pure.\n *\n * Schema: docs/fusion/task-capsule-v0.schema.json\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { indexFor } from '../engine/relations.js';\nimport { impactOf } from '../engine/impact.js';\nimport { hashString } from '../engine/hash.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\nimport type { CodeContext } from './types.js';\nimport { buildCodeContext, type BuildContextOptions } from './context.js';\n\nexport const TASK_CAPSULE_SCHEMA_VERSION = 'task-capsule/0' as const;\n/** Frozen ranking policy id — bump when the heuristic changes (benchmark gate). */\nexport const CAPSULE_RANKING_VERSION = 'capsule-rank@2026.07.0' as const;\nexport const CAPSULE_COMPILER_ID = 'vg-task-capsule/0' as const;\n\nexport interface BuildCapsuleOptions extends BuildContextOptions {\n /**\n * Read file contents relative to the repository root. Required for source\n * slices; when omitted, the capsule still builds metadata + empty slices\n * (useful for schema/shape tests).\n */\n readFile?: (relativePath: string) => string | null;\n /** Extra lines of context around each symbol span (default 1). */\n padding?: number;\n /** Max source slices after merge (default 12). */\n maxSlices?: number;\n repositoryId?: string | null;\n /** Optional provenance from the Model Execution Profile / security ladder. */\n provenance?: CapsuleProvenanceExtras;\n /**\n * Extra pinned facts (e.g. high-confidence federation bridge edges) appended\n * after graph-derived facts. Secret-free, short strings only.\n */\n extraPinnedFacts?: string[];\n}\n\nexport interface CapsuleSymbolRef {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n span: { start: number; end: number };\n signature?: string | null;\n why: string;\n importance: number;\n}\n\nexport interface SourceSlice {\n file: string;\n start: number;\n end: number;\n content: string;\n contentHash: string;\n symbolIds: string[];\n}\n\nexport interface CapsuleRelationship {\n kind: 'calls' | 'called-by' | 'impacts' | 'contains' | 'other';\n from: string;\n to: string;\n}\n\nexport interface VerificationPlan {\n syntaxFiles: string[];\n suggestedTests: string[];\n notes: string[];\n}\n\nexport interface TaskCapsule {\n schemaVersion: typeof TASK_CAPSULE_SCHEMA_VERSION;\n instruction: string;\n primary: CapsuleSymbolRef[];\n supporting: CapsuleSymbolRef[];\n sourceSlices: SourceSlice[];\n relationships: CapsuleRelationship[];\n pinnedFacts: string[];\n targetFiles: string[];\n verificationPlan: VerificationPlan;\n rendered: string;\n tokensEstimate: number;\n provenance: {\n compiler: string;\n rankingVersion: string;\n graphCorpusHash: string | null;\n repositoryId: string | null;\n /** Model Execution Profile id when resolved (Fusion Phase 4/7). */\n modelProfileId?: string | null;\n /** Security tier for shell during this task. */\n securityTier?: string | null;\n /** Frozen policy / ranking patch id if any. */\n policyVersion?: string | null;\n };\n}\n\nexport interface CapsuleProvenanceExtras {\n modelProfileId?: string | null;\n securityTier?: string | null;\n policyVersion?: string | null;\n}\n\n/** Host-safe capsule summary for VS Code / stream-json capsule transparency. */\nexport interface CapsuleSummary {\n schemaVersion: string;\n instruction: string;\n primary: Array<{ qualifiedName: string; file: string; kind: string }>;\n supporting: Array<{ qualifiedName: string; file: string; kind: string }>;\n sourceSliceCount: number;\n sourceFiles: string[];\n tokensEstimate: number;\n rankingVersion: string;\n /** Truncated rendered capsule for display (not the full prompt dump). */\n preview: string;\n}\n\n/** Host-safe capsule summary (capsule transparency UI / stream-json). */\nexport function summarizeCapsule(capsule: TaskCapsule): CapsuleSummary {\n const sourceFiles = [...new Set(capsule.sourceSlices.map((s) => s.file))].sort();\n const preview = capsule.rendered.length > 4000 ? `${capsule.rendered.slice(0, 4000)}\\n… (truncated)` : capsule.rendered;\n return {\n schemaVersion: capsule.schemaVersion,\n instruction: capsule.instruction,\n primary: capsule.primary.map((p) => ({ qualifiedName: p.qualifiedName, file: p.file, kind: p.kind })),\n supporting: capsule.supporting.map((p) => ({ qualifiedName: p.qualifiedName, file: p.file, kind: p.kind })),\n sourceSliceCount: capsule.sourceSlices.length,\n sourceFiles,\n tokensEstimate: capsule.tokensEstimate,\n rankingVersion: capsule.provenance.rankingVersion,\n preview,\n };\n}\n\n/**\n * Compile a source-bearing Task Capsule. Reuses the same seed / impact /\n * fact-pinning path as {@link buildCodeContext}, then attaches exact source\n * slices and a verification sketch.\n */\nexport function buildTaskCapsule(graph: VgGraph, instruction: string, options: BuildCapsuleOptions = {}): TaskCapsule {\n const base = buildCodeContext(graph, instruction, options);\n const padding = options.padding ?? 1;\n const maxSlices = options.maxSlices ?? 12;\n const budget = options.budget ?? 3000;\n const index = indexFor(graph);\n\n const primary = base.seeds.map((s) => toRef(s.node, s.why));\n const primaryIds = new Set(primary.map((p) => p.id));\n\n const supporting: CapsuleSymbolRef[] = [];\n for (const { node, via } of base.impacted) {\n if (primaryIds.has(node.id)) continue;\n supporting.push(toRef(node, `depends on ${via}`));\n }\n\n const relationships = collectRelationships(base, index);\n const sourceSlices = options.readFile\n ? buildSourceSlices(\n [...base.seeds.map((s) => s.node), ...base.impacted.map((i) => i.node)],\n options.readFile,\n padding,\n maxSlices,\n )\n : [];\n\n const extraFacts = (options.extraPinnedFacts ?? []).filter((f) => typeof f === 'string' && f.trim());\n const pinnedFacts = [...base.pinnedFacts, ...extraFacts];\n const verificationPlan = buildVerificationPlan(graph, base);\n const rendered = renderCapsule(instruction, primary, supporting, sourceSlices, pinnedFacts, base.targetFiles, verificationPlan, relationships, budget);\n\n return {\n schemaVersion: TASK_CAPSULE_SCHEMA_VERSION,\n instruction,\n primary,\n supporting,\n sourceSlices,\n relationships,\n pinnedFacts,\n targetFiles: base.targetFiles,\n verificationPlan,\n rendered,\n tokensEstimate: estimateTokens(rendered),\n provenance: {\n compiler: CAPSULE_COMPILER_ID,\n rankingVersion: CAPSULE_RANKING_VERSION,\n graphCorpusHash: graph.provenance?.corpusHash ?? null,\n repositoryId: options.repositoryId ?? null,\n modelProfileId: options.provenance?.modelProfileId ?? null,\n securityTier: options.provenance?.securityTier ?? null,\n policyVersion: options.provenance?.policyVersion ?? null,\n },\n };\n}\n\n/**\n * Project a capsule into the legacy {@link CodeContext} shape so the existing\n * agent prompt path can consume it without a full rewrite (A/B flag).\n */\nexport function capsuleToCodeContext(capsule: TaskCapsule): CodeContext {\n return {\n instruction: capsule.instruction,\n seeds: capsule.primary.map((p) => ({\n node: {\n id: p.id,\n qualifiedName: p.qualifiedName,\n kind: p.kind,\n file: p.file,\n span: p.span,\n signature: p.signature ?? undefined,\n importance: p.importance,\n } as GraphNode,\n why: p.why,\n })),\n targetFiles: capsule.targetFiles,\n impacted: capsule.supporting.map((s) => ({\n node: {\n id: s.id,\n qualifiedName: s.qualifiedName,\n kind: s.kind,\n file: s.file,\n span: s.span,\n signature: s.signature ?? undefined,\n importance: s.importance,\n } as GraphNode,\n via: s.why.replace(/^depends on /, ''),\n })),\n pinnedFacts: capsule.pinnedFacts,\n rendered: capsule.rendered,\n tokensEstimate: capsule.tokensEstimate,\n };\n}\n\nfunction toRef(node: GraphNode, why: string): CapsuleSymbolRef {\n return {\n id: node.id,\n qualifiedName: node.qualifiedName,\n kind: node.kind,\n file: normalize(node.file),\n span: { start: node.span.start, end: node.span.end },\n signature: node.signature ?? null,\n why,\n importance: node.importance,\n };\n}\n\nfunction collectRelationships(\n base: CodeContext,\n index: ReturnType<typeof indexFor>,\n): CapsuleRelationship[] {\n const out: CapsuleRelationship[] = [];\n const seen = new Set<string>();\n const push = (kind: CapsuleRelationship['kind'], from: string, to: string) => {\n const key = `${kind}|${from}|${to}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({ kind, from, to });\n };\n\n for (const { node } of base.seeds) {\n for (const c of index.callees(node.id).slice(0, 6)) {\n push('calls', node.qualifiedName, c.node.qualifiedName);\n }\n for (const c of index.callers(node.id).slice(0, 6)) {\n push('called-by', node.qualifiedName, c.node.qualifiedName);\n }\n }\n for (const { node, via } of base.impacted.slice(0, 10)) {\n push('impacts', via, node.qualifiedName);\n }\n\n // Stable order for determinism.\n return out.sort((a, b) => a.kind.localeCompare(b.kind) || a.from.localeCompare(b.from) || a.to.localeCompare(b.to));\n}\n\nfunction buildSourceSlices(\n nodes: GraphNode[],\n readFile: (relativePath: string) => string | null,\n padding: number,\n maxSlices: number,\n): SourceSlice[] {\n // Prefer concrete symbols over file/module containers for source evidence.\n const eligible = nodes.filter((n) => !['file', 'module', 'package'].includes(n.kind));\n const byFile = new Map<string, GraphNode[]>();\n for (const n of eligible) {\n const file = normalize(n.file);\n const list = byFile.get(file) ?? [];\n list.push(n);\n byFile.set(file, list);\n }\n\n type Range = { file: string; start: number; end: number; symbolIds: string[]; score: number };\n const ranges: Range[] = [];\n\n for (const [file, fileNodes] of [...byFile.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n const sorted = [...fileNodes].sort((a, b) => a.span.start - b.span.start || b.importance - a.importance);\n let current: Range | null = null;\n for (const n of sorted) {\n const start = Math.max(1, n.span.start - padding);\n const end = n.span.end + padding;\n const score = n.importance + (n.isHub ? 0.25 : 0);\n if (current && current.file === file && start <= current.end + 2) {\n current.end = Math.max(current.end, end);\n current.symbolIds.push(n.id);\n current.score = Math.max(current.score, score);\n } else {\n if (current) ranges.push(current);\n current = { file, start, end, symbolIds: [n.id], score };\n }\n }\n if (current) ranges.push(current);\n }\n\n ranges.sort((a, b) => b.score - a.score || a.file.localeCompare(b.file) || a.start - b.start);\n\n const slices: SourceSlice[] = [];\n for (const range of ranges) {\n if (slices.length >= maxSlices) break;\n const raw = readFile(range.file);\n if (raw === null) continue;\n const lines = raw.split('\\n');\n const start = Math.min(range.start, lines.length);\n const end = Math.min(range.end, lines.length);\n if (start < 1 || end < start) continue;\n const content = lines.slice(start - 1, end).join('\\n');\n slices.push({\n file: range.file,\n start,\n end,\n content,\n contentHash: hashString(content),\n symbolIds: [...new Set(range.symbolIds)].sort(),\n });\n }\n\n // Stable final order: file then start line (score only used for selection).\n return slices.sort((a, b) => a.file.localeCompare(b.file) || a.start - b.start);\n}\n\nfunction buildVerificationPlan(graph: VgGraph, base: CodeContext): VerificationPlan {\n const syntaxFiles = [...base.targetFiles].sort();\n const seedIds = new Set(base.seeds.map((s) => s.node.id));\n const suggestedTests: string[] = [];\n\n for (const n of graph.nodes) {\n if (n.kind !== 'test') continue;\n // Prefer tests that share a file with seeds or whose name mentions a seed.\n const sameFile = base.seeds.some((s) => normalize(s.node.file) === normalize(n.file));\n const nameHit = base.seeds.some((s) => n.qualifiedName.toLowerCase().includes(s.node.name.toLowerCase()));\n if (sameFile || nameHit || seedIds.has(n.id)) {\n suggestedTests.push(n.qualifiedName);\n }\n }\n suggestedTests.sort();\n\n const notes: string[] = [];\n if (!suggestedTests.length) {\n notes.push('No graph-linked tests found for seed symbols; run the nearest project test command after apply.');\n }\n if (base.impacted.some((i) => i.node.isHub || i.node.importance >= 0.7)) {\n notes.push('High-importance dependents in blast radius — prefer targeted tests before a full build.');\n }\n\n return {\n syntaxFiles,\n suggestedTests: suggestedTests.slice(0, 12),\n notes,\n };\n}\n\nfunction renderCapsule(\n instruction: string,\n primary: CapsuleSymbolRef[],\n supporting: CapsuleSymbolRef[],\n slices: SourceSlice[],\n pinnedFacts: string[],\n targetFiles: string[],\n verification: VerificationPlan,\n relationships: CapsuleRelationship[],\n budget: number,\n): string {\n const lines: string[] = [];\n lines.push('# Task capsule (source-bearing, from the deterministic code graph)');\n lines.push('');\n lines.push('Use the exact source evidence below. Search or read outside it only if this capsule is insufficient.');\n lines.push('');\n\n if (pinnedFacts.length) {\n lines.push('## Hard constraints (do not violate)');\n for (const f of pinnedFacts) lines.push(`- ${f}`);\n lines.push('');\n }\n\n lines.push('## Primary symbols');\n for (const s of primary) {\n lines.push(`- ${s.qualifiedName} (${s.kind}, ${s.file}:${s.span.start}-${s.span.end})${s.signature ? ` — \\`${s.signature}\\`` : ''} — ${s.why}`);\n }\n lines.push('');\n\n if (supporting.length) {\n lines.push('## Supporting / blast radius');\n for (const s of supporting.slice(0, 10)) {\n lines.push(`- ${s.qualifiedName} (${s.file}:${s.span.start}) — ${s.why}`);\n }\n lines.push('');\n }\n\n if (relationships.length) {\n lines.push('## Relationships');\n for (const r of relationships.slice(0, 24)) {\n lines.push(`- ${r.kind}: ${r.from} → ${r.to}`);\n }\n lines.push('');\n }\n\n lines.push('## Exact source evidence');\n if (!slices.length) {\n lines.push('_No source slices available (file reader missing or spans unreadable)._');\n lines.push('');\n } else {\n let included = 0;\n for (const slice of slices) {\n const block = [\n `### ${slice.file}:${slice.start}-${slice.end}`,\n `\\`\\`\\`${langFor(slice.file)}`,\n slice.content,\n '```',\n '',\n ];\n const candidate = [...lines, ...block, '## Task', instruction].join('\\n');\n if (estimateTokens(candidate) > budget && included > 0) break;\n lines.push(...block);\n included += 1;\n }\n }\n\n lines.push('## Files in scope');\n for (const f of targetFiles) lines.push(`- ${f}`);\n lines.push('');\n\n lines.push('## Verification plan');\n for (const f of verification.syntaxFiles) lines.push(`- syntax: ${f}`);\n for (const t of verification.suggestedTests) lines.push(`- test: ${t}`);\n for (const n of verification.notes) lines.push(`- note: ${n}`);\n lines.push('');\n\n lines.push('## Task');\n lines.push(instruction);\n return lines.join('\\n');\n}\n\nfunction langFor(file: string): string {\n const ext = file.split('.').pop()?.toLowerCase() ?? '';\n const map: Record<string, string> = {\n ts: 'ts',\n tsx: 'tsx',\n js: 'js',\n jsx: 'jsx',\n mjs: 'js',\n cjs: 'js',\n py: 'python',\n rs: 'rust',\n go: 'go',\n java: 'java',\n cs: 'csharp',\n md: 'md',\n json: 'json',\n };\n return map[ext] ?? '';\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n// Re-export query touch so tree-shaking keeps the dependency explicit for tests.\nexport const __testing = { queryGraph, impactOf };\n"]}
|