@vibgrate/cli 2026.722.2 → 2026.727.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/DOCS.md +418 -213
  2. package/README.md +34 -8
  3. package/dist/baseline-TG4ATZGZ.js +8 -0
  4. package/dist/{baseline-BD3A7EXD.js.map → baseline-TG4ATZGZ.js.map} +1 -1
  5. package/dist/chunk-2MBL43EJ.js +82 -0
  6. package/dist/chunk-2MBL43EJ.js.map +1 -0
  7. package/dist/chunk-2XQDMLKB.js +465 -0
  8. package/dist/chunk-2XQDMLKB.js.map +1 -0
  9. package/dist/{chunk-PY3DNX5H.js → chunk-3Q7QBWFW.js} +13 -2
  10. package/dist/chunk-3Q7QBWFW.js.map +1 -0
  11. package/dist/chunk-3V24O47U.js +478 -0
  12. package/dist/chunk-3V24O47U.js.map +1 -0
  13. package/dist/chunk-5I4VSBWQ.js +764 -0
  14. package/dist/chunk-5I4VSBWQ.js.map +1 -0
  15. package/dist/{chunk-WNIIKCNF.js → chunk-6ABXHZRN.js} +59 -311
  16. package/dist/chunk-6ABXHZRN.js.map +1 -0
  17. package/dist/chunk-6AYDFFP5.js +136 -0
  18. package/dist/chunk-6AYDFFP5.js.map +1 -0
  19. package/dist/chunk-6UQMXIAG.js +122 -0
  20. package/dist/chunk-6UQMXIAG.js.map +1 -0
  21. package/dist/chunk-7N4Y3E47.js +108 -0
  22. package/dist/chunk-7N4Y3E47.js.map +1 -0
  23. package/dist/chunk-BPF3YX2U.js +64 -0
  24. package/dist/chunk-BPF3YX2U.js.map +1 -0
  25. package/dist/chunk-BWPBB45M.js +88 -0
  26. package/dist/chunk-BWPBB45M.js.map +1 -0
  27. package/dist/{chunk-6CXTPC74.js → chunk-CY4WKXB2.js} +27 -6
  28. package/dist/chunk-CY4WKXB2.js.map +1 -0
  29. package/dist/chunk-DGUM43GV.js +10 -0
  30. package/dist/chunk-DGUM43GV.js.map +1 -0
  31. package/dist/{chunk-NONYJLOJ.js → chunk-EX4PQT6W.js} +3 -3
  32. package/dist/{chunk-NONYJLOJ.js.map → chunk-EX4PQT6W.js.map} +1 -1
  33. package/dist/chunk-IS7VTH2Q.js +627 -0
  34. package/dist/chunk-IS7VTH2Q.js.map +1 -0
  35. package/dist/chunk-IZDH67DX.js +289 -0
  36. package/dist/chunk-IZDH67DX.js.map +1 -0
  37. package/dist/chunk-J4RFRKZH.js +2496 -0
  38. package/dist/chunk-J4RFRKZH.js.map +1 -0
  39. package/dist/chunk-J7LKEB2R.js +51 -0
  40. package/dist/chunk-J7LKEB2R.js.map +1 -0
  41. package/dist/chunk-JIBOJTGS.js +313 -0
  42. package/dist/chunk-JIBOJTGS.js.map +1 -0
  43. package/dist/chunk-K3MZIVZW.js +88 -0
  44. package/dist/chunk-K3MZIVZW.js.map +1 -0
  45. package/dist/chunk-K7REHDQS.js +776 -0
  46. package/dist/chunk-K7REHDQS.js.map +1 -0
  47. package/dist/{chunk-2O5YZVZV.js → chunk-KCKYKDMS.js} +23 -19
  48. package/dist/chunk-KCKYKDMS.js.map +1 -0
  49. package/dist/{chunk-3MXNNBLI.js → chunk-KNELIQJO.js} +1647 -2042
  50. package/dist/chunk-KNELIQJO.js.map +1 -0
  51. package/dist/chunk-KSBHGWRV.js +613 -0
  52. package/dist/chunk-KSBHGWRV.js.map +1 -0
  53. package/dist/chunk-LKVMI67M.js +1695 -0
  54. package/dist/chunk-LKVMI67M.js.map +1 -0
  55. package/dist/chunk-NDMDSPFX.js +69 -0
  56. package/dist/chunk-NDMDSPFX.js.map +1 -0
  57. package/dist/{chunk-CS37OBE3.js → chunk-OFUC6RYN.js} +791 -783
  58. package/dist/chunk-OFUC6RYN.js.map +1 -0
  59. package/dist/chunk-OOIG3RUM.js +276 -0
  60. package/dist/chunk-OOIG3RUM.js.map +1 -0
  61. package/dist/chunk-PMYWZRRS.js +62 -0
  62. package/dist/chunk-PMYWZRRS.js.map +1 -0
  63. package/dist/chunk-PXHNTC6D.js +382 -0
  64. package/dist/chunk-PXHNTC6D.js.map +1 -0
  65. package/dist/{chunk-I7GY7MVN.js → chunk-RNP3SMTV.js} +60 -12
  66. package/dist/chunk-RNP3SMTV.js.map +1 -0
  67. package/dist/chunk-TCDAZZNP.js +843 -0
  68. package/dist/chunk-TCDAZZNP.js.map +1 -0
  69. package/dist/{chunk-5BDHQ7DD.js → chunk-WGUL45AV.js} +24 -17
  70. package/dist/chunk-WGUL45AV.js.map +1 -0
  71. package/dist/cli.d.ts +3 -0
  72. package/dist/cli.js +3373 -617
  73. package/dist/cli.js.map +1 -1
  74. package/dist/execution-env-ZU45JZ4G.js +4 -0
  75. package/dist/execution-env-ZU45JZ4G.js.map +1 -0
  76. package/dist/federation-SZWZIFZ7.js +7 -0
  77. package/dist/federation-SZWZIFZ7.js.map +1 -0
  78. package/dist/{fs-IPY4FJKH.js → fs-B5HZ2MIU.js} +3 -2
  79. package/dist/fs-B5HZ2MIU.js.map +1 -0
  80. package/dist/{fs-KCABDURV.js → fs-O5IQYXHO.js} +3 -2
  81. package/dist/fs-O5IQYXHO.js.map +1 -0
  82. package/dist/git-ref-XDXB6JP5.js +4 -0
  83. package/dist/git-ref-XDXB6JP5.js.map +1 -0
  84. package/dist/graph-backend-73URGTFY.js +11 -0
  85. package/dist/graph-backend-73URGTFY.js.map +1 -0
  86. package/dist/index.d.ts +472 -137
  87. package/dist/index.js +15 -7
  88. package/dist/index.js.map +1 -1
  89. package/dist/{interactive-A4DISSIW.js → interactive-372NLI5C.js} +186 -226
  90. package/dist/interactive-372NLI5C.js.map +1 -0
  91. package/dist/llm-host-7GWDO6IX.js +9 -0
  92. package/dist/llm-host-7GWDO6IX.js.map +1 -0
  93. package/dist/load-I333TGNI.js +8 -0
  94. package/dist/load-I333TGNI.js.map +1 -0
  95. package/dist/local-runtime-5O2NN3GA.js +5 -0
  96. package/dist/local-runtime-5O2NN3GA.js.map +1 -0
  97. package/dist/mcp-tools-I7JK3S2M.js +4 -0
  98. package/dist/{mcp-tools-I6PME3AV.js.map → mcp-tools-I7JK3S2M.js.map} +1 -1
  99. package/dist/model-execution-profile-TFBKCNJG.js +4 -0
  100. package/dist/model-execution-profile-TFBKCNJG.js.map +1 -0
  101. package/dist/model-orchestrator-TVONAUPS.js +9 -0
  102. package/dist/model-orchestrator-TVONAUPS.js.map +1 -0
  103. package/dist/parse-worker.d.ts +1 -1
  104. package/dist/parse-worker.js +2 -1
  105. package/dist/parse-worker.js.map +1 -1
  106. package/dist/paths-2RAH3GME.js +6 -0
  107. package/dist/paths-2RAH3GME.js.map +1 -0
  108. package/dist/resolve-gguf-VPL4YQ6J.js +8 -0
  109. package/dist/resolve-gguf-VPL4YQ6J.js.map +1 -0
  110. package/dist/runtime-session-JRKCQUHY.js +18 -0
  111. package/dist/runtime-session-JRKCQUHY.js.map +1 -0
  112. package/dist/session-ITPYQ5XI.js +11 -0
  113. package/dist/{session-POJUDFPH.js.map → session-ITPYQ5XI.js.map} +1 -1
  114. package/dist/session-store-WFBX7HXL.js +4 -0
  115. package/dist/{session-store-W5RZZHA3.js.map → session-store-WFBX7HXL.js.map} +1 -1
  116. package/dist/{stream-json-Q2JGWPHB.js → stream-json-SLMDKLXP.js} +17 -6
  117. package/dist/stream-json-SLMDKLXP.js.map +1 -0
  118. package/dist/{types-Jl6RJ175.d.ts → types-7AHBUbFm.d.ts} +8 -2
  119. package/dist/ui-Q6DJ3GCU.js +5 -0
  120. package/dist/ui-Q6DJ3GCU.js.map +1 -0
  121. package/dist/vgd-7JV5KCNJ.js +17 -0
  122. package/dist/vgd-7JV5KCNJ.js.map +1 -0
  123. package/package.json +9 -6
  124. package/dist/baseline-BD3A7EXD.js +0 -7
  125. package/dist/chunk-2O5YZVZV.js.map +0 -1
  126. package/dist/chunk-3MXNNBLI.js.map +0 -1
  127. package/dist/chunk-5BDHQ7DD.js.map +0 -1
  128. package/dist/chunk-6CXTPC74.js.map +0 -1
  129. package/dist/chunk-CS37OBE3.js.map +0 -1
  130. package/dist/chunk-GGJZA3Q6.js +0 -961
  131. package/dist/chunk-GGJZA3Q6.js.map +0 -1
  132. package/dist/chunk-I7GY7MVN.js.map +0 -1
  133. package/dist/chunk-JBXNQCGE.js +0 -484
  134. package/dist/chunk-JBXNQCGE.js.map +0 -1
  135. package/dist/chunk-PY3DNX5H.js.map +0 -1
  136. package/dist/chunk-WNIIKCNF.js.map +0 -1
  137. package/dist/fs-IPY4FJKH.js.map +0 -1
  138. package/dist/fs-KCABDURV.js.map +0 -1
  139. package/dist/interactive-A4DISSIW.js.map +0 -1
  140. package/dist/mcp-tools-I6PME3AV.js +0 -3
  141. package/dist/session-POJUDFPH.js +0 -6
  142. package/dist/session-store-W5RZZHA3.js +0 -3
  143. package/dist/stream-json-Q2JGWPHB.js.map +0 -1
  144. package/dist/ui-HOVOPWMX.js +0 -4
  145. package/dist/ui-HOVOPWMX.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/lookup.ts","../src/engine/drift.ts","../src/engine/lockfile.ts","../src/engine/lib.ts"],"names":["fs","path","fs2","path2"],"mappings":"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","file":"chunk-GGJZA3Q6.js","sourcesContent":["import type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Lenient node resolution (VG-CLI-SPEC §3.3): resolve `<name>` by content-hash\n * id, qualified name, `file:line`, short name, or glob. Returns candidates\n * ranked by importance so the best match is first; ambiguity is surfaced (the\n * caller offers `--pick`). Deterministic ordering throughout.\n */\nexport function findNodes(graph: VgGraph, query: string): GraphNode[] {\n const q = query.trim();\n if (!q) return [];\n\n // 1. exact content-hash id\n const byId = graph.nodes.filter((n) => n.id === q);\n if (byId.length) return byId;\n\n // 2. file:line (e.g. src/order.ts:12) → smallest node spanning that line\n const fileLine = /^(.*):(\\d+)$/.exec(q);\n if (fileLine) {\n const file = fileLine[1];\n const line = Number(fileLine[2]);\n const spanning = graph.nodes\n .filter((n) => n.file === file && n.span.start <= line && n.span.end >= line && n.kind !== 'file')\n .sort((a, b) => a.span.end - a.span.start - (b.span.end - b.span.start));\n if (spanning.length) return spanning;\n }\n\n // 3. glob (contains * or ?)\n if (/[*?]/.test(q)) {\n const re = globToRegExp(q);\n return rank(graph.nodes.filter((n) => re.test(n.qualifiedName) || re.test(n.name) || re.test(n.file)));\n }\n\n // 4. exact qualified name, then short name, then case-insensitive\n const byQn = graph.nodes.filter((n) => n.qualifiedName === q);\n if (byQn.length) return rank(byQn);\n const byName = graph.nodes.filter((n) => n.name === q);\n if (byName.length) return rank(byName);\n\n const lower = q.toLowerCase();\n const ci = graph.nodes.filter(\n (n) => n.qualifiedName.toLowerCase() === lower || n.name.toLowerCase() === lower,\n );\n if (ci.length) return rank(ci);\n\n // 5. substring on qualified name (last resort, ranked)\n return rank(graph.nodes.filter((n) => n.qualifiedName.toLowerCase().includes(lower))).slice(0, 25);\n}\n\n/** Resolve to a single node, honoring a 1-based `--pick`. */\nexport function resolveOne(\n graph: VgGraph,\n query: string,\n pick?: number,\n): { node?: GraphNode; candidates: GraphNode[] } {\n const candidates = findNodes(graph, query);\n if (candidates.length === 0) return { candidates };\n if (pick && pick >= 1 && pick <= candidates.length) return { node: candidates[pick - 1], candidates };\n if (candidates.length === 1) return { node: candidates[0], candidates };\n return { candidates }; // ambiguous\n}\n\nexport function nodeById(graph: VgGraph, id: string): GraphNode | undefined {\n return graph.nodes.find((n) => n.id === id);\n}\n\nfunction rank(nodes: GraphNode[]): GraphNode[] {\n return [...nodes].sort(\n (a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName),\n );\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*').replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`, 'i');\n}\n","import * 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/util/logo.ts","../src/engine/attest.ts","../src/commands/attest-actions.ts","../src/util/progress.ts","../src/cli-options.ts","../src/commands/build.ts","../src/code/catalog.ts","../src/code/router.ts"],"names":["crypto2","resolve","path2","rel","fs2","path3","out","fs3","locals","basename"],"mappings":"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","file":"chunk-I7GY7MVN.js","sourcesContent":["import { c } from './output.js';\nimport { VERSION } from '../version.js';\n\n/**\n * The `vg` brand banner — the same boxy robot mark and brand colours (teal/mint)\n * as the Vibgrate scanner (`vibgrate-cli/src/ui/progress.ts`), replicated here so\n * the open graph package stays standalone.\n *\n * The wordmark is stacked BELOW the mark rather than beside it: the robot's eye\n * (`◼`) and arrow (`➜`) glyphs are East-Asian \"ambiguous\"/wide, so terminals that\n * render them double-width make the rows unequal — text placed to their right\n * (the scanner's layout) then misaligns. Nothing sits beside the art here, so the\n * banner lines up in every terminal. Shown on `vg build` for a human at a TTY;\n * never on `--json`, `--quiet`, or under a pipe.\n */\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\n// ── Boxy robot mark — identical glyphs/colours to the scanner's ROBOT ──\nconst ROBOT = [\n ' ' + teal('╭──────╮') + mint('➜'),\n ' ' + c.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + c.dim('├'),\n ' ' + c.dim('┤') + teal('│') + ' ' + c.dim('▁▁') + ' ' + teal('│') + c.dim('├'),\n ' ' + teal('╰──────╯'),\n] as const;\n\n/**\n * The banner as lines (no I/O) so it is unit-testable. The robot mark is a\n * self-contained block; the wordmark/tagline sit on their OWN lines beneath it\n * (never beside the variable-width glyphs), so the banner aligns in any terminal.\n */\nexport function logoLines(root?: string, opts: { product?: string; tagline?: string } = {}): string[] {\n const product = opts.product ?? 'Graph';\n const tagline = opts.tagline ?? 'Code Intelligence Engine';\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('Vibgrate')} ${teal(product)} ${c.dim(`· ${tagline} · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the banner to stderr, only for an interactive human (TTY). */\nexport function printLogo(root?: string, opts: { product?: string; tagline?: string } = {}): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${logoLines(root, opts).join('\\n')}\\n`);\n}\n\n/**\n * The **VG Code** banner (the approved marketing name for the code-editing\n * capability; see docs/NAMING-AND-MARKETING-STRATEGY.md). Same robot mark, but\n * the wordmark reads \"VG Code\" rather than \"Vibgrate Graph\".\n */\nexport function codeLogoLines(root?: string): string[] {\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('VG')} ${teal('Code')} ${c.dim(`· graph-grounded coding · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the VG Code banner to stderr, only for an interactive human (TTY). */\nexport function printCodeLogo(root?: string): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${codeLogoLines(root).join('\\n')}\\n`);\n}\n","import * as crypto from 'node:crypto';\nimport { canonicalize } from './hash.js';\nimport { VERSION } from '../version.js';\nimport type { Toolchain, VgGraph } from '../schema.js';\n\n/**\n * `vg attest` — a signed, reproducible attestation over the code graph.\n *\n * This is the moat made load-bearing: a consumer can cryptographically verify,\n * offline, that a graph was produced by a named toolchain over a named commit and\n * has not changed since. We sign an in-toto Statement wrapped in a DSSE envelope\n * with Ed25519 (`node:crypto`, zero dependencies) — interoperable with\n * `cosign verify-blob-attestation`. Ed25519 signatures are deterministic\n * (RFC 8032), so the same graph + key produce a byte-identical envelope.\n *\n * The subject digest excludes the graph's volatile `generatedAt`, so it is\n * reproducible across rebuilds of identical content — which is exactly what makes\n * the attestation verifiable rather than a timestamped snapshot.\n */\n\nexport const DSSE_PAYLOAD_TYPE = 'application/vnd.in-toto+json';\nexport const IN_TOTO_STATEMENT_TYPE = 'https://in-toto.io/Statement/v1';\nexport const VG_PREDICATE_TYPE = 'https://vibgrate.com/attestation/code-graph/v1';\n\nexport interface CommitInfo {\n sha?: string;\n shortSha?: string;\n branch?: string;\n dirty?: boolean; // uncommitted changes vs sha — never verified-clean when true\n}\n\nexport interface AttestPredicate {\n tool: { name: 'vg'; version: string };\n toolchain?: Toolchain;\n corpusHash: string;\n graphDigest: string; // sha256 of the canonical graph (generatedAt excluded)\n counts: VgGraph['meta']['counts'];\n commit?: CommitInfo;\n sbomDigest?: string; // sha256 of an accompanying SBOM, if attested together\n timestamp?: string; // optional, opt-in (omitted by default for determinism)\n}\n\nexport interface InTotoStatement {\n _type: string;\n subject: { name: string; digest: { sha256: string } }[];\n predicateType: string;\n predicate: AttestPredicate;\n}\n\nexport interface DsseSignature {\n keyid: string;\n sig: string; // base64\n publicKey?: string; // PEM, embedded so the envelope self-verifies for integrity\n}\n\nexport interface DsseEnvelope {\n payloadType: string;\n payload: string; // base64 of the Statement JSON\n signatures: DsseSignature[];\n}\n\nexport function sha256Hex(input: string | Uint8Array): string {\n return crypto.createHash('sha256').update(input).digest('hex');\n}\n\n/**\n * sha256 over the canonical graph with the volatile `generatedAt` excluded, so\n * two builds of identical content attest to the same digest.\n */\nexport function graphSubjectDigest(graph: VgGraph): string {\n const { generatedAt: _omit, ...rest } = graph;\n return sha256Hex(canonicalize(rest));\n}\n\n/** The 16-hex key id: a truncated sha256 over the SPKI DER public key. */\nexport function keyId(publicKey: crypto.KeyObject): string {\n return sha256Hex(publicKey.export({ type: 'spki', format: 'der' })).slice(0, 16);\n}\n\nexport interface StatementInput {\n commit?: CommitInfo;\n sbomDigest?: string;\n timestamp?: string;\n}\n\nexport function buildStatement(graph: VgGraph, input: StatementInput = {}): InTotoStatement {\n const graphDigest = graphSubjectDigest(graph);\n const predicate: AttestPredicate = {\n tool: { name: 'vg', version: VERSION },\n toolchain: graph.provenance.toolchain,\n corpusHash: graph.provenance.corpusHash,\n graphDigest,\n counts: graph.meta.counts,\n };\n if (input.commit) predicate.commit = input.commit;\n if (input.sbomDigest) predicate.sbomDigest = input.sbomDigest;\n if (input.timestamp) predicate.timestamp = input.timestamp;\n return {\n _type: IN_TOTO_STATEMENT_TYPE,\n subject: [{ name: 'graph.json', digest: { sha256: graphDigest } }],\n predicateType: VG_PREDICATE_TYPE,\n predicate,\n };\n}\n\n/**\n * DSSE Pre-Authentication Encoding:\n * \"DSSEv1\" SP len(type) SP type SP len(body) SP body\n * with lengths as ASCII decimal byte counts. Signing the PAE (not the raw body)\n * is what binds the payloadType to the signature.\n */\nexport function dssePae(payloadType: string, body: Uint8Array): Buffer {\n const typeBytes = Buffer.from(payloadType, 'utf8');\n const header = Buffer.from(\n `DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `,\n 'utf8',\n );\n return Buffer.concat([header, Buffer.from(body)]);\n}\n\n/** Sign a statement, returning a self-contained DSSE envelope. */\nexport function signStatement(statement: InTotoStatement, privateKey: crypto.KeyObject): DsseEnvelope {\n const body = Buffer.from(JSON.stringify(statement), 'utf8');\n const pae = dssePae(DSSE_PAYLOAD_TYPE, body);\n const sig = crypto.sign(null, pae, privateKey);\n // Derive the public key from the private key (via its PEM, for @types/node compat).\n const publicKey = crypto.createPublicKey(privateKey.export({ type: 'pkcs8', format: 'pem' }).toString());\n return {\n payloadType: DSSE_PAYLOAD_TYPE,\n payload: body.toString('base64'),\n signatures: [\n {\n keyid: keyId(publicKey),\n sig: sig.toString('base64'),\n publicKey: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n },\n ],\n };\n}\n\nexport type AttestStatus = 'verified' | 'signature-valid' | 'failed';\n\nexport interface VerifyResult {\n status: AttestStatus;\n signatureValid: boolean;\n signerPinned: boolean; // signature verified against a caller-supplied trusted key\n digestMatches?: boolean; // recomputed graph digest matches the attested one\n dirty?: boolean; // the attested commit had uncommitted changes\n keyid: string;\n reason: string;\n statement: InTotoStatement;\n}\n\n/**\n * Verify an envelope. Honest states, never a fabricated pass:\n * failed — bad signature, or the on-disk graph no longer matches.\n * signature-valid — cryptographically intact, but signer not pinned (or dirty).\n * verified — pinned signer + matching digest + clean tree.\n */\n/** An empty statement for results where the envelope could not even be parsed. */\nfunction emptyStatement(): InTotoStatement {\n return {\n _type: '',\n subject: [],\n predicateType: '',\n predicate: {\n tool: { name: 'vg', version: '' },\n corpusHash: '',\n graphDigest: '',\n counts: { nodes: 0, edges: 0, areas: 0, tests: 0, untested: 0 },\n },\n };\n}\n\nfunction failedResult(reason: string): VerifyResult {\n return {\n status: 'failed',\n signatureValid: false,\n signerPinned: false,\n keyid: '',\n reason,\n statement: emptyStatement(),\n };\n}\n\nexport function verifyEnvelope(\n env: DsseEnvelope,\n opts: { publicKeyPem?: string; graph?: VgGraph } = {},\n): VerifyResult {\n // A `.intoto.jsonl` is attacker-supplied input: every decode/parse/key step\n // must degrade to an honest `failed`, never crash the command.\n let body: Buffer;\n let statement: InTotoStatement;\n try {\n body = Buffer.from(env?.payload ?? '', 'base64');\n const parsed = JSON.parse(body.toString('utf8')) as InTotoStatement;\n if (!parsed || typeof parsed !== 'object' || !parsed.predicate) {\n throw new Error('missing predicate');\n }\n statement = parsed;\n } catch {\n return failedResult('malformed attestation payload (not a valid in-toto statement)');\n }\n\n const pae = dssePae(env.payloadType, body);\n const sig0 = env.signatures?.[0];\n const keyid = sig0?.keyid ?? '';\n const sig = sig0?.sig ? Buffer.from(sig0.sig, 'base64') : Buffer.alloc(0);\n\n let signatureValid = false;\n let signerPinned = false;\n try {\n if (sig0 && sig.length) {\n if (opts.publicKeyPem) {\n const pinnedKey = crypto.createPublicKey(opts.publicKeyPem);\n signatureValid = crypto.verify(null, pae, pinnedKey, sig);\n signerPinned = signatureValid;\n } else if (sig0.publicKey) {\n const embeddedKey = crypto.createPublicKey(sig0.publicKey);\n signatureValid = crypto.verify(null, pae, embeddedKey, sig);\n }\n }\n } catch {\n // Malformed key or signature bytes → not a valid signature (not a crash).\n signatureValid = false;\n signerPinned = false;\n }\n\n const digestMatches = opts.graph\n ? graphSubjectDigest(opts.graph) === statement.predicate.graphDigest\n : undefined;\n const dirty = statement.predicate.commit?.dirty;\n\n let status: AttestStatus;\n let reason: string;\n if (!signatureValid) {\n status = 'failed';\n reason = sig0 ? 'signature verification failed' : 'no signature in envelope';\n } else if (digestMatches === false) {\n status = 'failed';\n reason = 'graph.json no longer matches the attested digest (content changed since signing)';\n } else if (signerPinned && !dirty) {\n status = 'verified';\n reason =\n digestMatches === true\n ? 'signature valid, signer trusted, graph digest matches'\n : 'signature valid, signer trusted';\n } else {\n status = 'signature-valid';\n reason = dirty\n ? 'signature valid but the attested tree was dirty (uncommitted changes)'\n : 'signature valid but signer not pinned — pass --pub to establish trust';\n }\n\n return { status, signatureValid, signerPinned, digestMatches, dirty, keyid, reason, statement };\n}\n\nexport interface GeneratedKeypair {\n privatePem: string;\n publicPem: string;\n keyid: string;\n}\n\n/** Mint a fresh Ed25519 keypair for signing attestations. */\nexport function generateKeypair(): GeneratedKeypair {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');\n return {\n privatePem: privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(),\n publicPem: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n keyid: keyId(publicKey),\n };\n}\n\n/** Serialize an envelope as a single-line `.intoto.jsonl` record (deterministic). */\nexport function serializeEnvelope(env: DsseEnvelope): string {\n return `${JSON.stringify(env)}\\n`;\n}\n\nexport function parseEnvelope(text: string): DsseEnvelope {\n const line = text.trim().split('\\n')[0];\n return JSON.parse(line) as DsseEnvelope;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { execFile } from 'node:child_process';\nimport { loadGraph } from '../engine/load.js';\nimport { resolveHead, workingTreeDirty } from '../core-open/utils/git-history.js';\nimport {\n buildStatement,\n signStatement,\n verifyEnvelope,\n generateKeypair,\n serializeEnvelope,\n parseEnvelope,\n type CommitInfo,\n type VerifyResult,\n} from '../engine/attest.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Attestation actions folded into the graph lifecycle: `vg build --attest` signs\n * the graph it just built; `vg build --verify` checks a committed attestation.\n * The crypto lives in engine/attest.ts; this is the file/key/git glue + output.\n */\n\nconst DEFAULT_ATTESTATION = 'attestation.intoto.jsonl';\nconst DEFAULT_KEY = 'attest-key.pem';\n\nexport interface SignOpts {\n /** Signing key PEM path; else $VG_ATTEST_KEY; else .vibgrate/attest-key.pem (auto-minted). */\n key?: string;\n /** Output path for the attestation (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n}\n\nexport interface SignSummary {\n keyid: string;\n graphDigest: string;\n fingerprint?: string;\n commit?: CommitInfo;\n out: string;\n keyGeneratedAt?: string;\n}\n\n/** Sign an already-built graph, writing a DSSE attestation. Returns a summary +\n * human notices (the caller decides how to render them alongside build output). */\nexport async function signGraphAttestation(\n root: string,\n graph: VgGraph,\n opts: SignOpts,\n): Promise<{ summary: SignSummary; notices: string[] }> {\n const notices: string[] = [];\n const explicitKey = opts.key ?? process.env.VG_ATTEST_KEY;\n const keyPath = explicitKey ? path.resolve(explicitKey) : path.join(root, '.vibgrate', DEFAULT_KEY);\n\n let keyGeneratedAt: string | undefined;\n if (!fs.existsSync(keyPath)) {\n if (explicitKey) {\n throw new CliError(`signing key not found: ${explicitKey}`, ExitCode.USAGE_ERROR);\n }\n // First use with no key: mint one at the default path (loud — it must be kept\n // and gitignored to re-sign reproducibly).\n const kp = generateKeypair();\n fs.mkdirSync(path.dirname(keyPath), { recursive: true });\n fs.writeFileSync(keyPath, kp.privatePem, { mode: 0o600 });\n fs.writeFileSync(`${keyPath}.pub`, kp.publicPem);\n keyGeneratedAt = keyPath;\n notices.push(\n `minted a new Ed25519 signing key at ${rel(root, keyPath)} (keyid ${kp.keyid}) — ` +\n `keep it, add it to .gitignore, and reuse it to re-sign reproducibly`,\n );\n }\n\n let privateKey: crypto.KeyObject;\n try {\n privateKey = crypto.createPrivateKey(fs.readFileSync(keyPath, 'utf8'));\n } catch {\n throw new CliError(`could not read an Ed25519 private key from ${rel(root, keyPath)}`, ExitCode.USAGE_ERROR);\n }\n if (privateKey.asymmetricKeyType !== 'ed25519') {\n throw new CliError(\n `attest requires an Ed25519 key, but ${rel(root, keyPath)} is ${privateKey.asymmetricKeyType ?? 'unknown'}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const commit = await gitCommitInfo(root);\n const statement = buildStatement(graph, { commit });\n const envelope = signStatement(statement, privateKey);\n const outPath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, serializeEnvelope(envelope));\n\n return {\n summary: {\n keyid: envelope.signatures[0]?.keyid ?? '',\n graphDigest: statement.predicate.graphDigest,\n fingerprint: statement.predicate.toolchain?.fingerprint,\n commit,\n out: rel(root, outPath),\n keyGeneratedAt: keyGeneratedAt ? rel(root, keyGeneratedAt) : undefined,\n },\n notices,\n };\n}\n\nexport interface VerifyOpts {\n /** Attestation path (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n /** Public key PEM to pin the signer (else integrity-only verification). */\n pub?: string;\n}\n\nexport interface AttestVerifyOutcome {\n bundlePath: string;\n /** True when no attestation exists at the default path (and none was required). */\n missing: boolean;\n result?: VerifyResult;\n}\n\n/** Verify a committed attestation against the on-disk graph. Returns the outcome\n * (the caller renders + decides the exit code). Throws only when an attestation\n * was explicitly requested but is absent. */\nexport function verifyGraphAttestation(root: string, opts: VerifyOpts): AttestVerifyOutcome {\n const bundlePath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n if (!fs.existsSync(bundlePath)) {\n if (opts.attestation || opts.pub) {\n throw new CliError(\n `no attestation at ${rel(root, bundlePath)} — sign one with \\`vg build --attest\\``,\n ExitCode.NOT_FOUND,\n );\n }\n return { bundlePath, missing: true };\n }\n const envelope = parseEnvelope(fs.readFileSync(bundlePath, 'utf8'));\n const publicKeyPem = opts.pub ? fs.readFileSync(path.resolve(opts.pub), 'utf8') : undefined;\n const graph = loadGraph(root) ?? undefined;\n return { bundlePath, missing: false, result: verifyEnvelope(envelope, { publicKeyPem, graph }) };\n}\n\nasync function gitCommitInfo(root: string): Promise<CommitInfo | undefined> {\n const sha = await resolveHead(root);\n if (!sha) return undefined;\n const dirty = await workingTreeDirty(root);\n const branch = await gitBranch(root);\n return { sha, shortSha: sha.slice(0, 7), branch, dirty: dirty === true ? true : dirty === false ? false : undefined };\n}\n\n/** Best-effort current branch name; undefined on detached HEAD or no git. */\nfunction gitBranch(root: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { cwd: root, timeout: 5000, windowsHide: true, encoding: 'utf8' },\n (err, stdout) => {\n if (err) return resolve(undefined);\n const name = String(stdout).trim();\n resolve(name && name !== 'HEAD' ? name : undefined);\n },\n );\n });\n}\n\nfunction rel(root: string, p: string): string {\n const r = path.relative(root, p);\n return r.startsWith('..') ? p : r;\n}\n","import { c } from './output.js';\nimport { brandProgressBar } from '../core-open/ui/bar.js';\n\n/**\n * A small progress bar matching the scanner's style\n * (`vibgrate-core-open/src/ui/progress.ts`): a smooth sub-cell gradient bar\n * (shared `brandProgressBar`), a braille spinner, percent, elapsed and ETA.\n * Renders to **stderr** in place, and only when stderr is a TTY — under a\n * pipe/CI it stays silent so logs aren't polluted.\n */\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\nconst WIDTH = 30;\n\nfunction fmtDuration(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n return `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;\n}\n\n/**\n * Pure render of one progress line (no I/O, no clock) so it is unit-testable.\n * `elapsedMs` and `frame` are passed in by the caller.\n */\nexport function formatProgressLine(\n label: string,\n done: number,\n total: number,\n elapsedMs: number,\n frame: number,\n): string {\n const ratio = total > 0 ? Math.min(done / total, 1) : 0;\n const bar = brandProgressBar(ratio, WIDTH);\n const pct = Math.round(ratio * 100);\n const spin = c.cyan(FRAMES[((frame % FRAMES.length) + FRAMES.length) % FRAMES.length]);\n const eta = ratio > 0.02 && ratio < 1 ? ` · eta ${fmtDuration((elapsedMs / ratio) * (1 - ratio))}` : '';\n return ` ${spin} ${label} ${bar} ${c.bold(`${pct}%`)} ${c.dim(`${done}/${total} · ${fmtDuration(elapsedMs)}${eta}`)}`;\n}\n\n/** Live, in-place progress bar on stderr (no-op when stderr isn't a TTY). */\nexport class ProgressBar {\n private readonly start = Date.now();\n private frame = 0;\n private readonly tty = Boolean(process.stderr.isTTY);\n\n constructor(private readonly label: string) {}\n\n update(done: number, total: number): void {\n if (!this.tty) return;\n const line = formatProgressLine(this.label, done, total, Date.now() - this.start, this.frame++);\n process.stderr.write(`\\r\\x1b[2K${line}`);\n }\n\n /** Clear the bar; optionally print a final summary line. */\n done(summary?: string): void {\n if (!this.tty) return;\n process.stderr.write('\\r\\x1b[2K');\n if (summary) process.stderr.write(`${summary}\\n`);\n }\n}\n","import type { Command } from 'commander';\n\n/** Global flags shared across all `vg` commands (VG-CLI-SPEC §1.1). */\nexport interface GlobalOpts {\n /** -C, --cwd <dir> */\n cwd?: string;\n /** --deep */\n deep?: boolean;\n /** --json */\n json?: boolean;\n /** --generated-at <iso> */\n generatedAt?: string;\n /** --graph <file> (override the map path) */\n graph?: string;\n /** --no-cache (commander exposes this as `cache: false`) */\n noCache?: boolean;\n /** --local (never touch the network) */\n local?: boolean;\n /** --quiet */\n quiet?: boolean;\n /**\n * --client <name> — the AI on the other end (e.g. `claude`, `cursor`). When an\n * AI host runs `vg`, passing this lets navigation calls be counted in the local\n * savings ledger with the command-vs-MCP split, so `vg savings` and the opt-in\n * share-stats upload can attribute usage. Counts only; a coarse label, not\n * identity (sanitized before it's recorded). Absent for human-run commands.\n */\n client?: string;\n}\n\n/**\n * Attach the global flags to a command. They live on every subcommand (rather\n * than only the program) so the \"simple as Google\" dispatch can put the command\n * token first and let flags appear in any order after it.\n */\nexport function applyGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>', '.')\n .option('--deep', 'do more: precise resolution, all edges, semantic links')\n .option('--json', 'machine-readable JSON on stdout')\n .option('--generated-at <iso>', 'pin the artifact timestamp for byte-deterministic output')\n .option('--graph <file>', 'override the map path')\n .option('--no-cache', 'full rebuild (ignore the incremental cache)')\n .option('--local', 'never touch the network (lexical-only semantic)')\n .option('--quiet', 'suppress progress output')\n .option('--client <name>', 'identify the AI client (e.g. claude) so navigation calls are counted in vg savings')\n .option('--no-color', 'disable colored output');\n}\n\n/** Read the global subset from a command's parsed options. */\nexport function readGlobal(cmd: Command): GlobalOpts {\n // `optsWithGlobals()`, not `opts()`: a global flag (e.g. `--json`) declared on\n // both a command and its parent binds to the parent in commander, so a nested\n // subcommand (`vg models rm … --json`) would otherwise never see it.\n const o = cmd.optsWithGlobals() as Record<string, unknown>;\n return {\n cwd: o.cwd as string | undefined,\n deep: o.deep as boolean | undefined,\n json: o.json as boolean | undefined,\n generatedAt: o.generatedAt as string | undefined,\n graph: o.graph as string | undefined,\n noCache: o.cache === false,\n local: o.local as boolean | undefined,\n quiet: o.quiet as boolean | undefined,\n client: o.client as string | undefined,\n };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { verifyDeterminism } from '../engine/verify.js';\nimport { epistemicBreakdown } from '../engine/epistemic.js';\nimport { signGraphAttestation, verifyGraphAttestation, type SignSummary } from './attest-actions.js';\nimport { isModelReady, countPending, resolveEmbedModel } from '../engine/embeddings.js';\nimport type { VgGraph } from '../schema.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshInstalledInstructions, SMALL_REPO_FILES } from '../install/registry.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { renderReport } from '../engine/report.js';\nimport { renderHtml } from '../engine/html.js';\nimport { UsageError } from '../engine/discover.js';\nimport { ResourceLimitError } from '../engine/limits.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, out, json } from '../util/output.js';\nimport { printLogo } from '../util/logo.js';\nimport { ProgressBar } from '../util/progress.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\ninterface BuildCmdOpts {\n only?: string;\n exclude?: string[];\n html?: boolean;\n report?: boolean;\n ground?: boolean;\n jobs?: string;\n scip?: string | boolean;\n tsc?: boolean;\n export?: string;\n warm?: boolean;\n grammars?: string;\n attest?: boolean;\n verify?: boolean;\n attestKey?: string;\n attestation?: string;\n pub?: string;\n}\n\nexport function registerBuild(program: Command): void {\n const cmd = program\n .command('build')\n .description('build / update the code map (incremental, deterministic)')\n .argument('[paths...]', 'folders or files to map (default: current folder)')\n .option('--only <langs>', 'restrict to languages, e.g. ts,py,go')\n .option('--exclude <glob>', 'extra ignore glob (repeatable)', collect, [])\n .option('--no-html', 'do not write graph.html')\n .option('--no-report', 'do not write GRAPH_REPORT.md')\n .option('--no-ground', 'do not attach grounding (Phase 2)')\n .option('--jobs <n>', 'worker count (1 = single-threaded)')\n .option('--scip <file>', 'ingest a SCIP index for precise resolution (default: auto-detect index.scip)')\n .option('--no-scip', 'ignore any SCIP index')\n .option('--no-tsc', 'skip the in-process TypeScript resolver (heuristic floor only)')\n .option('--no-warm', 'do not warm the semantic index in the background after building')\n .option('--grammars <dir>', 'directory of grammar .wasm files (offline / air-gapped)')\n .option('-o, --export <file>', 'also write the map to a file (format inferred)')\n .option('--attest', 'sign the built graph → .vibgrate/attestation.intoto.jsonl')\n .option('--verify', 'verify a committed attestation against the graph (no rebuild)')\n .option('--attest-key <path>', 'signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)')\n .option('--attestation <file>', 'attestation path (out for --attest, in for --verify)')\n .option('--pub <path>', 'public key PEM to pin the signer (with --verify)')\n .action(async function (this: Command, paths: string[], opts: BuildCmdOpts) {\n await runBuild(paths, opts, readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nexport async function runBuild(\n paths: string[],\n opts: BuildCmdOpts,\n global: GlobalOpts,\n): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n\n // `vg build --verify`: the single verification entry point — determinism\n // self-check plus (if present) attestation verification.\n if (opts.verify) {\n await verifyGraph(root, opts, global);\n return;\n }\n\n // Brand banner + live parse progress for an interactive human while the index\n // builds (TTY only; both are no-ops under --json/--quiet/pipe so machine output\n // stays clean).\n const interactive = !global.json && !global.quiet;\n if (interactive) printLogo(path.basename(root) || root);\n const bar = interactive ? new ProgressBar(c.dim('parsing')) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n if (jobs !== undefined && (!Number.isInteger(jobs) || jobs < 1)) {\n throw usageError(`--jobs must be a positive integer (got \"${opts.jobs}\")`);\n }\n\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n let result;\n try {\n result = await buildGraph({\n root,\n paths: paths.length ? paths : undefined,\n only,\n exclude: opts.exclude,\n jobs,\n noCache: global.noCache,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n generatedAt: global.generatedAt,\n onParseProgress: bar ? (done, total) => bar.update(done, total) : undefined,\n grammarsDir: opts.grammars,\n });\n } catch (err) {\n bar?.done();\n if (err instanceof UsageError) throw usageError(err.message);\n // A resource safeguard fired (file-count cap, heap budget, worker OOM) —\n // the message already carries the remedy; surface it without a stack.\n if (err instanceof ResourceLimitError) throw new CliError(err.message, ExitCode.ERROR);\n throw err;\n }\n bar?.done();\n\n const written = writeArtifacts(result.graph, {\n root,\n html: opts.html,\n report: opts.report,\n graphPath: global.graph,\n });\n\n // Record the freshness snapshot (stat+hash per corpus file, plus this build's\n // scope) so `vg serve`/`vg ask` can auto-refresh the map when the tree drifts.\n // Skipped for a custom --graph target: that is an explicit artifact the\n // auto-refresh machinery must not manage.\n if (!global.graph) {\n writeSnapshot(root, result.graph.provenance.corpusHash, result.fileStats, {\n only,\n exclude: opts.exclude,\n paths: paths.length ? paths : undefined,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n grammarsDir: opts.grammars,\n });\n }\n\n if (opts.export) writeExport(result.graph, opts.export);\n\n // Bring previously-installed assistant instructions (skill/nudge files from\n // `vg install`) up to the current content version — so evolved instructions\n // reach this repo the first time a new CLI builds here. Only files carrying\n // vg's own version marker (or the exact legacy generated content) are\n // touched; a custom --graph build is an explicit artifact and skips this.\n if (!global.graph) {\n const fileCount = result.graph.nodes.filter((n) => n.kind === 'file').length;\n const refreshed = refreshInstalledInstructions(root, fileCount > 0 && fileCount < SMALL_REPO_FILES);\n if (interactive) {\n for (const r of refreshed) {\n info(c.dim(`vg · refreshed assistant instructions ${r.file} (v${r.from} → v${r.to})`));\n }\n }\n }\n\n // `--attest`: sign the freshly-built graph → .vibgrate/attestation.intoto.jsonl.\n let attestation: SignSummary | undefined;\n const attestNotices: string[] = [];\n if (opts.attest) {\n const signed = await signGraphAttestation(root, result.graph, {\n key: opts.attestKey,\n attestation: opts.attestation,\n });\n attestation = signed.summary;\n attestNotices.push(...signed.notices);\n }\n\n if (global.json) {\n json({\n ok: true,\n counts: result.graph.meta.counts,\n languages: result.graph.meta.languages,\n reparsed: result.reparsed,\n reused: result.reused,\n totalFiles: result.totalFiles,\n resolve: result.resolveStats,\n tsc: result.tsc,\n scip: result.scip,\n epistemic: epistemicBreakdown(result.graph.edges),\n artifacts: written,\n corpusHash: result.graph.provenance.corpusHash,\n toolchain: result.graph.provenance.toolchain,\n attestation,\n timingMs: result.timing.totalMs,\n warnings: result.warnings,\n });\n return;\n }\n\n const { counts } = result.graph.meta;\n const incremental =\n result.reused > 0\n ? `incremental: ${result.reparsed} of ${result.totalFiles} files re-parsed`\n : `${result.totalFiles} files parsed`;\n const seconds = (result.timing.totalMs / 1000).toFixed(2);\n info(`${c.cyan('vg')} · mapped ${rel(root)} in ${seconds}s (${incremental})`);\n info(\n ` nodes ${c.bold(String(counts.nodes))} edges ${c.bold(String(counts.edges))} ` +\n `areas ${counts.areas} langs ${result.graph.meta.languages.join(',') || '—'}`,\n );\n const callPct =\n result.resolveStats.callsResolved + result.resolveStats.callsUnresolved > 0\n ? Math.round(\n (100 * result.resolveStats.callsResolved) /\n (result.resolveStats.callsResolved + result.resolveStats.callsUnresolved),\n )\n : 100;\n // When a precise rung ran it is authoritative; callPct is only the heuristic\n // floor (label it so, to avoid understating the precise result below).\n const precise = result.tsc || result.scip;\n const callLabel = precise ? `heuristic floor ${callPct}%` : `calls resolved ${callPct}%`;\n info(c.dim(` ${callLabel} · resolver ${result.graph.provenance.resolver.join(',')}`));\n if (result.tsc) {\n const jsx = result.tsc.jsx > 0 ? `, ${result.tsc.jsx} JSX` : '';\n info(c.dim(` tsc: ${result.tsc.resolved} precise edges across ${result.tsc.files} TS/JS files (${result.tsc.calls} calls${jsx})`));\n }\n if (result.scip) {\n info(c.dim(` scip: ${result.scip.resolved} precise edges from ${result.scip.tool ?? 'index'} (${result.scip.documents} docs)`));\n }\n const ep = epistemicBreakdown(result.graph.edges);\n info(\n c.dim(\n ` edges by evidence · observed ${ep.observed} · name-matched ${ep['name-matched']} · declared ${ep.declared}`,\n ),\n );\n const artifactList = [written.graphPath, written.htmlPath, written.reportPath]\n .filter(Boolean)\n .map((p) => path.relative(root, p as string))\n .join(' ');\n info(` → ${artifactList}`);\n if (result.warnings.length) {\n info(c.yellow(` ${result.warnings.length} parse warning(s) — run with --json for detail`));\n }\n if (attestation) {\n for (const n of attestNotices) info(c.yellow(` ${n}`));\n info(\n c.dim(\n ` attested · keyid ${attestation.keyid} · digest ${attestation.graphDigest.slice(0, 16)}… → ${attestation.out}`,\n ),\n );\n }\n\n maybeWarmEmbeddings(root, result.graph, global, opts.warm !== false);\n}\n\n/**\n * `vg build --verify` — the single verification entry point. Runs the determinism\n * self-check (byte-identical rebuilds + toolchain fingerprint) and, when an\n * attestation is present, verifies it against the on-disk graph. Exit 4 on a\n * determinism failure, exit 2 on an attestation failure.\n */\nasync function verifyGraph(root: string, opts: BuildCmdOpts, global: GlobalOpts): Promise<void> {\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n const det = await verifyDeterminism({ root, only, exclude: opts.exclude, jobs });\n const attest = verifyGraphAttestation(root, { attestation: opts.attestation, pub: opts.pub });\n const attestFailed = !attest.missing && attest.result?.status === 'failed';\n\n if (global.json) {\n json({\n ok: det.ok && !attestFailed,\n determinism: { ok: det.ok, checks: det.checks, digest: det.digest },\n attestation: attest.missing\n ? null\n : {\n status: attest.result?.status,\n signatureValid: attest.result?.signatureValid,\n signerPinned: attest.result?.signerPinned,\n digestMatches: attest.result?.digestMatches,\n dirty: attest.result?.dirty,\n keyid: attest.result?.keyid,\n reason: attest.result?.reason,\n },\n });\n } else {\n info(`${c.cyan('vg build --verify')} · ${path.relative(process.cwd(), root) || '.'}`);\n for (const check of det.checks) {\n const mark = check.ok ? c.green('✔') : c.red('✘');\n const detail = check.detail ? c.dim(` (${check.detail})`) : '';\n info(` ${mark} ${check.name}${detail}`);\n }\n info(det.ok ? c.green(` deterministic · digest ${det.digest.slice(0, 16)}…`) : c.red(' NON-DETERMINISTIC'));\n if (attest.missing) {\n info(c.dim(` attestation: none (sign one with \\`vg build --attest\\`)`));\n } else {\n const r = attest.result;\n const badge =\n r?.status === 'verified'\n ? c.green('✔ attestation verified')\n : r?.status === 'signature-valid'\n ? c.yellow('~ attestation signature valid')\n : c.red('✘ attestation failed');\n info(` ${badge}${r?.keyid ? c.dim(` · keyid ${r.keyid}`) : ''}`);\n info(c.dim(` ${r?.reason ?? ''}`));\n }\n }\n\n if (!det.ok) throw new CliError('determinism self-check failed', ExitCode.NON_DETERMINISTIC);\n if (attestFailed) throw new CliError('attestation verification failed', ExitCode.GATE_FAILED);\n}\n\n/**\n * After an interactive build we have just committed to a code graph, so the\n * user is likely to run `vg ask`/`vg serve` next — start warming the semantic\n * index in the background now so that first semantic call is instant instead of\n * paying a cold model load. If the model isn't downloaded yet, the background\n * warm fetches it (once, centrally) rather than deferring the whole cost to the\n * first `ask`. Disabled with `--no-warm`; skipped under --json/--quiet/--local\n * and when not at a TTY (so CI never auto-downloads). The detached child runs\n * `vg embed --bg [--download]`; a lock prevents it racing a foreground `ask`.\n */\nfunction maybeWarmEmbeddings(root: string, graph: VgGraph, global: GlobalOpts, warm: boolean): void {\n if (!warm || global.json || global.quiet || global.local) return;\n if (!process.stdout.isTTY && !process.stderr.isTTY) return;\n const cli = process.argv[1];\n if (!cli) return;\n const modelId = resolveEmbedModel();\n const ready = isModelReady(modelId);\n // Already fully warm: model present and every node embedded → nothing to do.\n if (ready && countPending(graph, root, modelId) === 0) return;\n // When the model isn't on this machine yet, start the one-time download now\n // (the graph is built; the next semantic call shouldn't wait for it).\n const args = ready\n ? [cli, 'embed', '-C', root, '--bg']\n : [cli, 'embed', '-C', root, '--bg', '--download'];\n try {\n const child = spawn(process.execPath, args, { detached: true, stdio: 'ignore' });\n child.unref();\n info(\n c.dim(\n ready\n ? ' warming the semantic index in the background — `vg ask` will be instant'\n : ' downloading the semantic model in the background (once) — `vg ask`/`vg serve` will be instant; disable with --no-warm',\n ),\n );\n } catch {\n /* warm-up is best-effort */\n }\n}\n\nfunction writeExport(graph: Parameters<typeof serializeGraph>[0], target: string): void {\n if (target === '-') {\n out(serializeGraph(graph).trimEnd());\n return;\n }\n const ext = path.extname(target).toLowerCase();\n let content: string;\n switch (ext) {\n case '.json':\n content = serializeGraph(graph);\n break;\n case '.md':\n content = renderReport(graph);\n break;\n case '.html':\n content = renderHtml(graph);\n break;\n default:\n throw new CliError(\n `cannot export to \"${ext || target}\" yet — supported in Phase 0: .json, .md, .html, \"-\" (stdout). ` +\n `More formats (graphml, dot, cypher) arrive with \\`vg export\\` in Phase 1.`,\n ExitCode.USAGE_ERROR,\n );\n }\n fs.mkdirSync(path.dirname(path.resolve(target)), { recursive: true });\n fs.writeFileSync(target, content);\n}\n\nfunction collect(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n\nfunction rel(root: string): string {\n const r = path.relative(process.cwd(), root);\n return r === '' ? '.' : r;\n}\n","/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (ollama, lmstudio, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n}\n\nconst HOSTED_IDS = new Set(['openrouter', 'litellm', 'openai', 'together']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n return { providers: [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)], reason: 'mock provider (scripted, offline)' };\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n const provider = buildExplicit(opts.provider, opts, env, discover);\n const fallbacks = opts.local || provider.local ? localFallbacks(opts, env, discover, provider.id) : [];\n return { providers: [provider, ...fallbacks], reason: `explicit --provider ${opts.provider}` };\n }\n\n // --local: on-device only, in preference order.\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '');\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Start Ollama (`ollama serve` + `ollama pull <model>`), run LM Studio, or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return { providers: locals, reason: '--local (on-device backends only)' };\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) A configured hosted router key (OpenRouter is the reference best-in-breed router).\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model);\n return { providers: [primary, ...localFallbacks(opts, env, discover, 'openrouter')], reason: 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)' };\n }\n // 2) A locally-pulled model.\n const locals = localFallbacks(opts, env, discover, '');\n if (locals.length) return { providers: locals, reason: 'a local model is available → on-device (no key needed)' };\n // 3) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return { providers: [buildHosted(id, model)], reason: `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}` };\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: set OPENROUTER_API_KEY for the hosted router, run Ollama locally (`ollama serve`), or use --local with a local model. Set the model with --model or VG_CODE_MODEL. (No models are installed by default.)',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp') {\n const modelPath = opts.modelPath || env.VG_CODE_MODEL_PATH;\n if (!modelPath) throw new CliError('--provider llama-cpp needs a gguf path via --model-path or VG_CODE_MODEL_PATH (no weights are downloaded automatically; see `vg models`).', ExitCode.USAGE_ERROR);\n return new LocalLlamaProvider(opts.model ?? basename(modelPath), modelPath, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'));\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));\n throw new CliError(`unknown --provider \"${id}\". Known: ollama, lmstudio, openrouter, litellm, openai, together, llama-cpp.`, ExitCode.USAGE_ERROR);\n}\n\nfunction buildHosted(id: string, model: string): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n const config: OpenAiCompatibleConfig = { ...base, id };\n return new OpenAiCompatibleProvider(model, config);\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[], exclude: string): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n // LM Studio serves an OpenAI-compatible endpoint locally; include if a model id is known.\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (exclude !== 'lmstudio' && lmModel) out.push(buildHosted('lmstudio', lmModel));\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}