@vibgrate/cli 2026.825.2 → 2026.829.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/DOCS.md +204 -9
  2. package/README.md +2 -0
  3. package/dist/{agent-DHQYEHVW.js → agent-5GW7C7EB.js} +14 -14
  4. package/dist/{agent-DHQYEHVW.js.map → agent-5GW7C7EB.js.map} +1 -1
  5. package/dist/{approvals-KBM72NU2.js → approvals-ISJFILVK.js} +5 -5
  6. package/dist/{approvals-KBM72NU2.js.map → approvals-ISJFILVK.js.map} +1 -1
  7. package/dist/{attach-O74NL4M5.js → attach-JUSALQ75.js} +3 -3
  8. package/dist/{attach-O74NL4M5.js.map → attach-JUSALQ75.js.map} +1 -1
  9. package/dist/baseline-YL2IZZ4Y.js +9 -0
  10. package/dist/{baseline-4X6MQBDA.js.map → baseline-YL2IZZ4Y.js.map} +1 -1
  11. package/dist/{chunk-JAEHLTVX.js → chunk-5RW5PIBH.js} +3 -3
  12. package/dist/{chunk-JAEHLTVX.js.map → chunk-5RW5PIBH.js.map} +1 -1
  13. package/dist/{chunk-TT2J2TB6.js → chunk-65YN3BG3.js} +1207 -40
  14. package/dist/chunk-65YN3BG3.js.map +1 -0
  15. package/dist/{chunk-VMPKOMHG.js → chunk-B5VCPIKT.js} +7 -6
  16. package/dist/chunk-B5VCPIKT.js.map +1 -0
  17. package/dist/{chunk-FQHWPOTS.js → chunk-BA6YBVNT.js} +3 -3
  18. package/dist/{chunk-FQHWPOTS.js.map → chunk-BA6YBVNT.js.map} +1 -1
  19. package/dist/{chunk-3E7QT4NE.js → chunk-BODXEZEY.js} +9 -9
  20. package/dist/{chunk-3E7QT4NE.js.map → chunk-BODXEZEY.js.map} +1 -1
  21. package/dist/{chunk-BICZR6UJ.js → chunk-D3SV3JWB.js} +3 -3
  22. package/dist/{chunk-BICZR6UJ.js.map → chunk-D3SV3JWB.js.map} +1 -1
  23. package/dist/chunk-EGMBHPXV.js +127 -0
  24. package/dist/chunk-EGMBHPXV.js.map +1 -0
  25. package/dist/{chunk-DIZ5KI5Q.js → chunk-FHSEK64W.js} +7 -7
  26. package/dist/{chunk-DIZ5KI5Q.js.map → chunk-FHSEK64W.js.map} +1 -1
  27. package/dist/{chunk-E3XVIFSH.js → chunk-FKCN653F.js} +3 -3
  28. package/dist/{chunk-E3XVIFSH.js.map → chunk-FKCN653F.js.map} +1 -1
  29. package/dist/{chunk-OIUVWCKM.js → chunk-FPIMNVLI.js} +12 -4
  30. package/dist/chunk-FPIMNVLI.js.map +1 -0
  31. package/dist/{chunk-NS4DL3QR.js → chunk-HHMWE52J.js} +10 -135
  32. package/dist/chunk-HHMWE52J.js.map +1 -0
  33. package/dist/{chunk-5UG4UHKU.js → chunk-HUJZO4K5.js} +281 -106
  34. package/dist/chunk-HUJZO4K5.js.map +1 -0
  35. package/dist/{chunk-HFQIYM6E.js → chunk-JWQ2JCQS.js} +4 -4
  36. package/dist/{chunk-HFQIYM6E.js.map → chunk-JWQ2JCQS.js.map} +1 -1
  37. package/dist/{chunk-27TS2AUJ.js → chunk-K7QR7U3V.js} +12 -11
  38. package/dist/chunk-K7QR7U3V.js.map +1 -0
  39. package/dist/{chunk-IJVWKZRS.js → chunk-KCKG3EEJ.js} +3 -3
  40. package/dist/{chunk-IJVWKZRS.js.map → chunk-KCKG3EEJ.js.map} +1 -1
  41. package/dist/{chunk-GWSJYDK7.js → chunk-MMIIVRQC.js} +7 -7
  42. package/dist/chunk-MMIIVRQC.js.map +1 -0
  43. package/dist/chunk-N6R4XPLX.js +27 -0
  44. package/dist/chunk-N6R4XPLX.js.map +1 -0
  45. package/dist/{chunk-GR7SFCQJ.js → chunk-NQQT75AN.js} +77 -27
  46. package/dist/chunk-NQQT75AN.js.map +1 -0
  47. package/dist/{chunk-6MIJLO5B.js → chunk-NSC7ZK62.js} +3 -3
  48. package/dist/{chunk-6MIJLO5B.js.map → chunk-NSC7ZK62.js.map} +1 -1
  49. package/dist/{chunk-SYMJSRYF.js → chunk-OAYSRM7J.js} +12 -14
  50. package/dist/chunk-OAYSRM7J.js.map +1 -0
  51. package/dist/{chunk-L7GCJNDT.js → chunk-QMROD7MI.js} +15 -8
  52. package/dist/chunk-QMROD7MI.js.map +1 -0
  53. package/dist/{chunk-SHD5TCZ5.js → chunk-R2FX4USU.js} +7 -7
  54. package/dist/chunk-R2FX4USU.js.map +1 -0
  55. package/dist/{chunk-7M4E7UGX.js → chunk-RL7JYG3D.js} +3 -3
  56. package/dist/{chunk-7M4E7UGX.js.map → chunk-RL7JYG3D.js.map} +1 -1
  57. package/dist/{chunk-QLNJ3VWO.js → chunk-RRSUNTZI.js} +3 -3
  58. package/dist/{chunk-QLNJ3VWO.js.map → chunk-RRSUNTZI.js.map} +1 -1
  59. package/dist/{chunk-NZES47ST.js → chunk-TWFPHXPN.js} +3 -3
  60. package/dist/{chunk-NZES47ST.js.map → chunk-TWFPHXPN.js.map} +1 -1
  61. package/dist/chunk-UGRUG2FA.js +6 -0
  62. package/dist/{chunk-G3ACLBMG.js.map → chunk-UGRUG2FA.js.map} +1 -1
  63. package/dist/{chunk-KYM55VZX.js → chunk-VOEEYCR3.js} +6 -6
  64. package/dist/{chunk-KYM55VZX.js.map → chunk-VOEEYCR3.js.map} +1 -1
  65. package/dist/{chunk-SIXWWQ6S.js → chunk-WBDRBP22.js} +4 -4
  66. package/dist/{chunk-SIXWWQ6S.js.map → chunk-WBDRBP22.js.map} +1 -1
  67. package/dist/{chunk-K3SXWOTT.js → chunk-YL332BU2.js} +20 -15
  68. package/dist/chunk-YL332BU2.js.map +1 -0
  69. package/dist/{chunk-2NUS5BOR.js → chunk-ZQY5TWCB.js} +3 -3
  70. package/dist/{chunk-2NUS5BOR.js.map → chunk-ZQY5TWCB.js.map} +1 -1
  71. package/dist/cli.d.ts +16 -1
  72. package/dist/cli.js +2362 -342
  73. package/dist/cli.js.map +1 -1
  74. package/dist/{daemon-RZS5FPIW.js → daemon-NRIIDMX2.js} +10 -10
  75. package/dist/{daemon-RZS5FPIW.js.map → daemon-NRIIDMX2.js.map} +1 -1
  76. package/dist/embed-worker-main.js +3 -3
  77. package/dist/{ensure-map-DL2S774J.js → ensure-map-VAIYCCEJ.js} +17 -16
  78. package/dist/{ensure-map-DL2S774J.js.map → ensure-map-VAIYCCEJ.js.map} +1 -1
  79. package/dist/explain-EXPJTCB5.js +126 -0
  80. package/dist/explain-EXPJTCB5.js.map +1 -0
  81. package/dist/{graph-backend-JXARVT3R.js → graph-backend-V5A2H5ZB.js} +7 -7
  82. package/dist/{graph-backend-JXARVT3R.js.map → graph-backend-V5A2H5ZB.js.map} +1 -1
  83. package/dist/index.d.ts +217 -13
  84. package/dist/index.js +17 -16
  85. package/dist/index.js.map +1 -1
  86. package/dist/{interactive-2XRBRFRB.js → interactive-VQM2CTE2.js} +37 -32
  87. package/dist/interactive-VQM2CTE2.js.map +1 -0
  88. package/dist/load-UAVA732M.js +11 -0
  89. package/dist/{load-7C5VETRD.js.map → load-UAVA732M.js.map} +1 -1
  90. package/dist/parse-worker.js +2 -2
  91. package/dist/{rules-ASYEUNB5.js → rules-TLRGB5L4.js} +12 -4
  92. package/dist/rules-TLRGB5L4.js.map +1 -0
  93. package/dist/{run-outcome-TMB5TJNA.js → run-outcome-EATWIKLR.js} +5 -5
  94. package/dist/{run-outcome-TMB5TJNA.js.map → run-outcome-EATWIKLR.js.map} +1 -1
  95. package/dist/{runtime-session-Y23NVY7R.js → runtime-session-Y2BRBXUW.js} +9 -9
  96. package/dist/{runtime-session-Y23NVY7R.js.map → runtime-session-Y2BRBXUW.js.map} +1 -1
  97. package/dist/{session-KXT2ZTPE.js → session-N2FTYIHQ.js} +9 -9
  98. package/dist/{session-KXT2ZTPE.js.map → session-N2FTYIHQ.js.map} +1 -1
  99. package/dist/{stream-json-NW6AOE47.js → stream-json-GCZAHORX.js} +14 -14
  100. package/dist/{stream-json-NW6AOE47.js.map → stream-json-GCZAHORX.js.map} +1 -1
  101. package/dist/version-XNZ4GLMQ.js +4 -0
  102. package/dist/{version-7ABYXWOZ.js.map → version-XNZ4GLMQ.js.map} +1 -1
  103. package/dist/{vg-mcp-bridge-LXBHKEFR.js → vg-mcp-bridge-VDZWFEO2.js} +22 -11
  104. package/dist/vg-mcp-bridge-VDZWFEO2.js.map +1 -0
  105. package/dist/{vgd-RW7HCEIP.js → vgd-3A2TRNP5.js} +8 -8
  106. package/dist/vgd-3A2TRNP5.js.map +1 -0
  107. package/package.json +2 -2
  108. package/dist/baseline-4X6MQBDA.js +0 -9
  109. package/dist/chunk-27TS2AUJ.js.map +0 -1
  110. package/dist/chunk-5UG4UHKU.js.map +0 -1
  111. package/dist/chunk-G3ACLBMG.js +0 -6
  112. package/dist/chunk-GR7SFCQJ.js.map +0 -1
  113. package/dist/chunk-GWSJYDK7.js.map +0 -1
  114. package/dist/chunk-K3SXWOTT.js.map +0 -1
  115. package/dist/chunk-L7GCJNDT.js.map +0 -1
  116. package/dist/chunk-NS4DL3QR.js.map +0 -1
  117. package/dist/chunk-OIUVWCKM.js.map +0 -1
  118. package/dist/chunk-SHD5TCZ5.js.map +0 -1
  119. package/dist/chunk-SYMJSRYF.js.map +0 -1
  120. package/dist/chunk-TT2J2TB6.js.map +0 -1
  121. package/dist/chunk-VMPKOMHG.js.map +0 -1
  122. package/dist/chunk-YENM3HT7.js +0 -23
  123. package/dist/chunk-YENM3HT7.js.map +0 -1
  124. package/dist/interactive-2XRBRFRB.js.map +0 -1
  125. package/dist/load-7C5VETRD.js +0 -11
  126. package/dist/rules-ASYEUNB5.js.map +0 -1
  127. package/dist/version-7ABYXWOZ.js +0 -4
  128. package/dist/vg-mcp-bridge-LXBHKEFR.js.map +0 -1
  129. package/dist/vgd-RW7HCEIP.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/snapshot.ts","../src/engine/report.ts","../src/engine/html.ts","../src/engine/relevance-provider.ts","../src/engine/artifacts.ts","../src/engine/relevance-enrich.ts"],"names":["crc32","fs","path","fs2","legacy","MAGIC","zlib2","newPackr","Packr","fs4","path3","cached","tags"],"mappings":"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","file":"chunk-OIUVWCKM.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as zlib from 'node:zlib';\nimport { Packr } from 'msgpackr';\nimport { parseGraph } from './serialize.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Binary graph snapshot — a derived, local **cache** beside `graph.json`.\n *\n * `graph.json` stays the canonical, committed, human-diffable artifact and the\n * only interchange format (`vg export` / `share` / `bundle` are unchanged); the\n * determinism contract attaches to it, not to this file. The snapshot exists\n * purely so hot paths (`vg ask`/`serve`/`code`, vgd session attach) skip the\n * large-string `JSON.parse` on load and the pretty-print on write — measured\n * ~2.6× faster cold load and ~4× faster encode on XL maps, at ~40% of the size.\n *\n * Robustness rules (each one keeps JSON as the unquestioned fallback):\n * - The loader trusts a snapshot only when its recorded (size, mtimeMs) of\n * the source `graph.json` still match — any rebuild or hand-edit of the\n * JSON silently invalidates it. Staleness never needs to parse the JSON.\n * - A CRC-32 over the payload rejects torn/corrupted files; any decode error\n * (unknown magic, short file, bad msgpack, version skew) returns null\n * rather than throwing, and the caller re-reads JSON and rewrites the\n * snapshot (\"self-healing\" — first load after upgrade migrates for free).\n * - Writes are atomic (temp + rename) and best-effort: a full disk or\n * read-only store must never fail a build or a query.\n * - The engine VERSION is recorded and must match: the msgpack record layout\n * tracks the in-memory graph shape, which may change between releases.\n *\n * Format: MAGIC (\"VGSNAP1\\0\") · u32LE header length · msgpack header\n * {engine, sourceSize, sourceMtimeMs, crc32} · msgpack graph payload.\n * Everything is explicit little-endian via DataView/Buffer — no platform\n * variance. msgpackr runs its pure-JS path (its native accelerator is an\n * optional dependency we do not rely on); a fresh Packr per encode/decode\n * keeps record-id assignment deterministic for identical input.\n */\n\nconst MAGIC = Buffer.from('VGSNAP1\\0', 'latin1');\n\n/** node:zlib gained crc32 in 22.2; fall back to a table crc for 22.0/22.1. */\nconst crc32: (data: Uint8Array) => number = zlib.crc32 ?? jsCrc32;\n\nlet crcTable: Uint32Array | null = null;\n\nfunction jsCrc32(data: Uint8Array): number {\n if (!crcTable) {\n crcTable = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n crcTable[n] = c >>> 0;\n }\n }\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\ninterface SnapshotHeader {\n engine: string;\n crc32: number;\n /**\n * True when the snapshot IS the map (global-store mode, no graph.json\n * beside it). False/absent = sidecar of a canonical graph.json, valid only\n * while that JSON's recorded stat still matches.\n */\n standalone?: boolean;\n sourceSize?: number;\n sourceMtimeMs?: number;\n}\n\n/** Sidecar path for a map file: `…/graph.json` → `…/graph.snap`. */\nexport function snapshotPathFor(graphPath: string): string {\n return graphPath.endsWith('.json') ? `${graphPath.slice(0, -5)}.snap` : `${graphPath}.snap`;\n}\n\nfunction newPackr(): Packr {\n return new Packr({ useRecords: true });\n}\n\n/** Msgpack payload bytes for a graph (exported for the determinism test). */\nexport function encodeGraphPayload(graph: VgGraph): Buffer {\n return Buffer.from(newPackr().pack(graph));\n}\n\n/**\n * Write the snapshot beside `graphPath`.\n *\n * Sidecar mode (default): call after `graph.json` is on disk — the header\n * records its stat so readers can cheaply detect staleness.\n * `standalone: true` (global-store mode): the snapshot IS the map; no\n * `graph.json` is required or consulted.\n * Best-effort: returns false (never throws) when the file can't be written.\n */\nexport function writeGraphSnapshot(\n graphPath: string,\n graph: VgGraph,\n opts: { standalone?: boolean } = {},\n): boolean {\n try {\n const payload = encodeGraphPayload(graph);\n let header: Buffer;\n if (opts.standalone) {\n header = newPackr().pack({\n engine: VERSION,\n crc32: crc32(payload),\n standalone: true,\n } satisfies SnapshotHeader);\n } else {\n const stat = fs.statSync(graphPath);\n header = newPackr().pack({\n engine: VERSION,\n sourceSize: stat.size,\n sourceMtimeMs: stat.mtimeMs,\n crc32: crc32(payload),\n } satisfies SnapshotHeader);\n }\n const lenBuf = Buffer.alloc(4);\n lenBuf.writeUInt32LE(header.length, 0);\n const file = snapshotPathFor(graphPath);\n const tmp = `${file}.${process.pid}.tmp`;\n try {\n fs.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, header, payload]));\n fs.renameSync(tmp, file);\n } catch (err) {\n fs.rmSync(tmp, { force: true });\n throw err;\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load the snapshot for `graphPath`, or null when it is absent, stale,\n * or corrupted.\n *\n * Sidecar snapshots additionally require their source `graph.json` to exist\n * with an unchanged stat AND an identical engine version — the JSON fallback\n * is free, so any doubt invalidates. Standalone snapshots are the map itself:\n * they are accepted on magic + CRC + a structural sanity check, including\n * across engine versions (msgpack embeds its record layout, so an older\n * snapshot decodes the same way an older committed graph.json would parse).\n */\nexport function readGraphSnapshot(graphPath: string): VgGraph | null {\n try {\n const file = snapshotPathFor(graphPath);\n if (!fs.existsSync(file)) return null;\n const raw = fs.readFileSync(file);\n if (raw.length < MAGIC.length + 4 || !raw.subarray(0, MAGIC.length).equals(MAGIC)) return null;\n const headerLen = raw.readUInt32LE(MAGIC.length);\n const payloadStart = MAGIC.length + 4 + headerLen;\n if (payloadStart > raw.length) return null;\n const header = newPackr().unpack(raw.subarray(MAGIC.length + 4, payloadStart)) as SnapshotHeader;\n if (!header.standalone) {\n if (header.engine !== VERSION) return null;\n const sourceStat = fs.statSync(graphPath); // no source JSON → nothing to be a cache of\n if (header.sourceSize !== sourceStat.size || header.sourceMtimeMs !== sourceStat.mtimeMs) return null;\n }\n const payload = raw.subarray(payloadStart);\n if (crc32(payload) !== header.crc32) return null;\n const graph = newPackr().unpack(payload) as VgGraph;\n if (!graph || !Array.isArray(graph.nodes) || !Array.isArray(graph.edges)) return null;\n return graph;\n } catch {\n return null;\n }\n}\n\n/**\n * Does a map exist at `graphPath` in either representation — the canonical\n * `graph.json`, or a standalone binary snapshot (global-store mode)?\n * Cheap: reads only the snapshot header, never the payload or the JSON.\n */\nexport function mapFileExists(graphPath: string): boolean {\n if (fs.existsSync(graphPath)) return true;\n return readSnapshotHeader(snapshotPathFor(graphPath))?.standalone === true;\n}\n\n/**\n * Stat for \"did the map change on disk\" mtime tracking: the JSON when\n * present, else the standalone snapshot file. Throws when neither exists —\n * same contract callers had with `fs.statSync(graphPath)`.\n */\nexport function mapFileStat(graphPath: string): fs.Stats {\n try {\n return fs.statSync(graphPath);\n } catch (err) {\n const snap = snapshotPathFor(graphPath);\n if (fs.existsSync(snap)) return fs.statSync(snap);\n throw err;\n }\n}\n\n/** Parse just the envelope header of a snapshot file (null on any problem). */\nfunction readSnapshotHeader(file: string): SnapshotHeader | null {\n let fd: number | null = null;\n try {\n fd = fs.openSync(file, 'r');\n const prefix = Buffer.alloc(4096);\n const read = fs.readSync(fd, prefix, 0, prefix.length, 0);\n if (read < MAGIC.length + 4 || !prefix.subarray(0, MAGIC.length).equals(MAGIC)) return null;\n const headerLen = prefix.readUInt32LE(MAGIC.length);\n if (MAGIC.length + 4 + headerLen > read) return null;\n return newPackr().unpack(prefix.subarray(MAGIC.length + 4, MAGIC.length + 4 + headerLen)) as SnapshotHeader;\n } catch {\n return null;\n } finally {\n if (fd !== null) fs.closeSync(fd);\n }\n}\n\n/**\n * Load a map file, preferring the binary snapshot and self-healing it.\n * Fast path: valid snapshot (sidecar or standalone) → decode it. Fallback:\n * parse `graph.json`, then (best-effort) rewrite the sidecar so the next load\n * takes the fast path. Returns null only when neither representation yields a\n * graph — exactly the cases the pre-snapshot code treated as \"no graph\".\n */\nexport function loadGraphFileWithSnapshot(graphPath: string): VgGraph | null {\n const snap = readGraphSnapshot(graphPath);\n if (snap) return snap;\n let json: string;\n try {\n json = fs.readFileSync(graphPath, 'utf8');\n } catch {\n return null;\n }\n let graph: VgGraph;\n try {\n graph = parseGraph(json);\n } catch {\n return null;\n }\n writeGraphSnapshot(graphPath, graph);\n return graph;\n}\n","import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic Markdown summary (`GRAPH_REPORT.md`). Given a pinned\n * `generatedAt`, the report is byte-stable. Numbers are derived purely from the\n * graph, so the report can be regenerated from a committed `graph.json`.\n */\nexport function renderReport(graph: VgGraph): string {\n const { meta, provenance, nodes, edges } = graph;\n const lines: string[] = [];\n\n lines.push('# Code Graph Report');\n lines.push('');\n lines.push(`Generated by \\`vg\\` ${provenance.version} · schema \\`${graph.schemaVersion}\\``);\n lines.push('');\n lines.push('## Summary');\n lines.push('');\n lines.push(`- **Nodes:** ${meta.counts.nodes.toLocaleString('en-US')}`);\n lines.push(`- **Edges:** ${meta.counts.edges.toLocaleString('en-US')}`);\n lines.push(`- **Areas:** ${meta.counts.areas.toLocaleString('en-US')}`);\n lines.push(`- **Languages:** ${meta.languages.join(', ') || '—'}`);\n lines.push(`- **Clustering:** ${meta.cluster}`);\n lines.push(`- **Resolvers:** ${provenance.resolver.join(', ')}`);\n lines.push(`- **Edge kinds:** ${meta.edgeKinds.join(', ') || '—'}`);\n lines.push('');\n\n // Files by definition count.\n const fileNodes = nodes.filter((n) => n.kind === 'file');\n const defsByFile = new Map<string, number>();\n for (const n of nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n defsByFile.set(n.file, (defsByFile.get(n.file) ?? 0) + 1);\n }\n const topFiles = [...defsByFile.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 15);\n if (topFiles.length) {\n lines.push('## Largest files (by definitions)');\n lines.push('');\n lines.push('| File | Definitions |');\n lines.push('| --- | ---: |');\n for (const [file, count] of topFiles) lines.push(`| \\`${file}\\` | ${count} |`);\n lines.push('');\n }\n\n // Most-connected nodes (Phase 0 importance = normalised degree).\n const topNodes = nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 15);\n if (topNodes.length) {\n lines.push('## Most-connected definitions');\n lines.push('');\n lines.push('| Symbol | Kind | File | Importance |');\n lines.push('| --- | --- | --- | ---: |');\n for (const n of topNodes) {\n lines.push(\n `| \\`${n.qualifiedName}\\` | ${n.kind} | \\`${n.file}\\`:${n.span.start} | ${n.importance.toFixed(3)} |`,\n );\n }\n lines.push('');\n }\n\n // Edge-kind breakdown.\n const byKind = new Map<string, number>();\n for (const e of edges) byKind.set(e.kind, (byKind.get(e.kind) ?? 0) + 1);\n if (byKind.size) {\n lines.push('## Edges by kind');\n lines.push('');\n lines.push('| Kind | Count |');\n lines.push('| --- | ---: |');\n for (const [kind, count] of [...byKind.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(`| ${kind} | ${count} |`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push(`_Files: ${fileNodes.length} · Corpus: \\`${provenance.corpusHash.slice(0, 16)}…\\`_`);\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { stableStringify } from './serialize.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * `graph.html`: self-contained, dependency-free, deterministic overview.\n *\n * For small/medium maps we embed the full graph JSON for tooling.\n * For large maps (default: >5k nodes) we embed only a\n * **hub + area summary** so the HTML stays openable; full data stays in\n * graph.json / graph.db. Interactive WebGL (sigma.js) remains a follow-up.\n */\n\nconst EMBED_NODE_LIMIT = 5_000;\n\nexport function renderHtml(graph: VgGraph): string {\n const top = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 50);\n\n const areas = [...graph.areas]\n .sort((a, b) => b.size - a.size || a.id - b.id)\n .slice(0, 40);\n\n const rows = top\n .map(\n (n) =>\n `<tr><td><code>${esc(n.qualifiedName)}</code></td><td>${esc(n.kind)}</td>` +\n `<td><code>${esc(n.file)}</code>:${n.span.start}</td><td>${n.importance.toFixed(3)}</td></tr>`,\n )\n .join('\\n');\n\n const areaRows = areas\n .map(\n (a) =>\n `<tr><td>${a.id}</td><td><code>${esc(a.label)}</code></td>` +\n `<td>${a.size}</td><td>${a.cohesion.toFixed(3)}</td><td>${a.externalEdges}</td></tr>`,\n )\n .join('\\n');\n\n const large = graph.meta.counts.nodes > EMBED_NODE_LIMIT;\n const embedPayload = large\n ? {\n schemaVersion: graph.schemaVersion,\n generatedAt: graph.generatedAt,\n provenance: graph.provenance,\n meta: graph.meta,\n hubs: top.map((n) => ({\n id: n.id,\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n area: n.area,\n })),\n areas: areas.map((a) => ({\n id: a.id,\n label: a.label,\n size: a.size,\n cohesion: a.cohesion,\n externalEdges: a.externalEdges,\n })),\n note: `Full graph omitted (${graph.meta.counts.nodes} nodes > ${EMBED_NODE_LIMIT}). Use graph.json or .vibgrate/cache/graph.db.`,\n }\n : graph;\n\n const embedded = stableStringify(embedPayload, 0);\n const tier = graph.meta.analysisTier ?? 'full';\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>vg · code graph</title>\n<style>\n :root { color-scheme: light dark; }\n body { font: 14px/1.5 system-ui, sans-serif; margin: 2rem auto; max-width: 60rem; padding: 0 1rem; }\n h1 { font-size: 1.4rem; } h2 { font-size: 1.1rem; margin-top: 2rem; }\n table { border-collapse: collapse; width: 100%; }\n th, td { text-align: left; padding: 4px 8px; border-bottom: 1px solid #8884; }\n td:last-child, th:last-child { text-align: right; }\n .meta { color: #888; } code { font-size: 0.9em; }\n .banner { background: #8882; padding: 0.6rem 0.8rem; border-radius: 6px; margin: 1rem 0; }\n</style>\n</head>\n<body>\n<h1>vg · code graph</h1>\n<p class=\"meta\">${graph.meta.counts.nodes} nodes · ${graph.meta.counts.edges} edges ·\n${graph.meta.counts.areas} areas · ${esc(graph.meta.languages.join(', ') || '—')} ·\nclustering: ${esc(graph.meta.cluster)} · tier: ${esc(tier)} · vg ${esc(graph.provenance.version)}</p>\n${\n large\n ? `<p class=\"banner\">Large map (${graph.meta.counts.nodes} nodes): HTML shows hubs + areas only.\nFull graph remains in <code>graph.json</code> / <code>.vibgrate/cache/graph.db</code> (query via <code>vg serve</code>).</p>`\n : ''\n}\n<h2>Areas (subsystems)</h2>\n<table>\n<thead><tr><th>Id</th><th>Label</th><th>Size</th><th>Cohesion</th><th>External</th></tr></thead>\n<tbody>\n${areaRows || '<tr><td colspan=\"5\" class=\"meta\">no areas</td></tr>'}\n</tbody>\n</table>\n<h2>Most-connected definitions (hubs)</h2>\n<table>\n<thead><tr><th>Symbol</th><th>Kind</th><th>Location</th><th>Importance</th></tr></thead>\n<tbody>\n${rows}\n</tbody>\n</table>\n<p class=\"meta\">${large ? 'Summary payload' : 'Full graph'} embedded below for tooling.</p>\n<script type=\"application/json\" id=\"vg-graph\">\n${embedded}\n</script>\n</body>\n</html>\n`;\n}\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n","/**\n * Relevance-provider seam for ask / Task Capsule seed ranking.\n *\n * Since the 2026-08 relevance relocation, the separately installed local\n * module (`@vibgrate/relevance`, auto-provisioned by the CLI) IS the ranking\n * engine: `rankQuestion` hands it the ask plus a name-only symbol view of\n * the loaded graph and receives an ordered, provenance-annotated seed list\n * and the plain-language concept map. When the module is unavailable —\n * offline install failure, explicit decline, `VIBGRATE_NO_KERNEL=1`, or a\n * pre-ranking module version — callers fall back to the host's mechanical\n * exact-name matcher (engine/query.ts) and proceed unchanged.\n *\n * Loading mirrors the optional-embedder pattern (engine/embeddings.ts):\n * - `VIBGRATE_NO_KERNEL=1` disables the seam entirely.\n * - `VIBGRATE_RELEVANCE_PATH` points at a provider module (a file, or a\n * directory containing `index.js`).\n * - Otherwise the default module location is probed:\n * `$XDG_CACHE_HOME|~/.cache /vibgrate/modules/relevance/index.js`.\n * The module contract: it exports `createRelevanceProvider()` returning\n * `{ version(), analyzeQuery(q), tagNode?(input), rankSymbols?(q, symbols, opts) }`.\n *\n * Trust boundary: everything a module returns is sanitized here before it\n * can shape a capsule. A ranking may only ORDER symbols the loaded graph\n * actually has (`sanitizeRank`: unknown ids dropped, scores validated,\n * every printable string stripped of control characters and length-capped).\n * Every failure path degrades to `null` (→ mechanical fallback), never to an\n * error: the module is the brain, not a dependency.\n *\n * Determinism: given the same question, graph, and provider version, the\n * sanitized ranking is deterministic; the provider version is surfaced so\n * capsules can record it as ranking provenance.\n */\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\n\nexport interface RelevanceExpansion {\n /** Single lowercase word, ready for identifier-part matching. */\n term: string;\n /** The question token/phrase (or topic id) that produced it. */\n from: string;\n /** 0..1 relative confidence; scales the expansion's scoring contribution. */\n weight: number;\n}\n\nexport interface RelevanceTopic {\n id: string;\n /** 0..1, normalized within one analysis. */\n score: number;\n}\n\n/** One level of a matched taxonomy path, root-first. */\nexport interface RelevanceTaxonomyLevel {\n id: string;\n path: string;\n /** 0..1 — never lower than the levels beneath it. */\n score: number;\n /** This level's own vocabulary. */\n terms: string[];\n}\n\n/** A hierarchical match: the most specific node plus its ancestor chain. */\nexport interface RelevanceTaxonomyMatch {\n /** \"infrastructure/networking/dns/cname\" */\n path: string;\n levels: RelevanceTaxonomyLevel[];\n score: number;\n /** Absolute evidence behind the match, not relative to other matches. */\n evidence: number;\n /** What matched — \"~\" prefixes a fuzzy repair. */\n via: string[];\n /** The matched node's OWN vocabulary, for explaining the domain. */\n terms: string[];\n /** Filenames and extensions this node's work lives in, nearest first. */\n files: string[];\n /** Standards governing this node, current revision first. */\n standards: RelevanceStandard[];\n}\n\n/** A product the ask names, including through a misspelling. */\nexport interface RelevanceVendorMatch {\n name: string;\n from: string;\n node?: string;\n topic: string;\n score: number;\n /** Filenames and extensions this vendor's configuration lives in. */\n files: string[];\n}\n\n/** A standard governing the matched area, at the revision the pack tracks. */\nexport interface RelevanceStandard {\n name: string;\n publisher: string;\n node: string;\n /** \"standard\" or \"regulation\". */\n kind: string;\n /** Lowercase category slugs from the website's own vocabulary. */\n categories: string[];\n}\n\n/** A misspelling the provider resolved. */\nexport interface RelevanceCorrection {\n from: string;\n to: string;\n distance: number;\n}\n\nexport interface RelevanceAnalysis {\n version: string;\n topics: RelevanceTopic[];\n expansions: RelevanceExpansion[];\n /** Hierarchical matches, most specific first. Absent from older providers. */\n taxonomy?: RelevanceTaxonomyMatch[];\n vendors?: RelevanceVendorMatch[];\n corrections?: RelevanceCorrection[];\n /** Every file hint the analysis implies, most specific first. */\n files?: string[];\n /** Standards governing what the ask is about, most specific node first. */\n standards?: RelevanceStandard[];\n /** Deduped lowercase category slugs across those standards. */\n categories?: string[];\n}\n\n/** One graph symbol, as handed to the provider's ranker: identity and name\n * material only — never source contents. */\nexport interface RankableSymbol {\n id: string;\n name: string;\n qualifiedName: string;\n file: string;\n importance: number;\n}\n\nexport interface RankOptions {\n limit?: number;\n priorQuestion?: string | null;\n topicTags?: Record<string, readonly string[]> | null;\n}\n\nexport interface RankedSeed {\n id: string;\n score: number;\n why: string;\n}\n\n/** The provider's full ranking answer (schema 5), pre-sanitization. */\nexport interface RankResult {\n version: string;\n hasContent: boolean;\n seeds: RankedSeed[];\n conceptMap: string[];\n}\n\nexport interface RelevanceProvider {\n version(): string;\n analyzeQuery(question: string): RelevanceAnalysis;\n /** Optional build-time enrichment: deterministic topic tags for one node\n * (path + identifier evidence). Providers without it still work. */\n tagNode?(input: { qualifiedName: string; file: string }): string[];\n /**\n * Schema-5: rank the given symbols for one ask. When present, the module\n * IS the relevance engine — the host delegates seed selection here and\n * keeps only mechanical name matching as its module-less fallback. A\n * provider without it is treated as no ranking engine at all.\n */\n rankSymbols?(question: string, symbols: RankableSymbol[], opts?: RankOptions): RankResult;\n}\n\nfunction disabled(): boolean {\n const v = process.env.VIBGRATE_NO_KERNEL;\n return v === '1' || v === 'true';\n}\n\n/** Default install location for the optional relevance module (shared with\n * the install flow in install/relevance-module.ts). */\nexport function relevanceModuleDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'modules', 'relevance');\n}\n\nfunction defaultModulePath(): string {\n return path.join(relevanceModuleDir(), 'index.js');\n}\n\nfunction candidatePaths(): string[] {\n const custom = process.env.VIBGRATE_RELEVANCE_PATH;\n if (custom) {\n const p = path.resolve(custom);\n try {\n if (fs.statSync(p).isDirectory()) return [path.join(p, 'index.js')];\n } catch {\n /* fall through — treat as a file path */\n }\n return [p];\n }\n return [defaultModulePath()];\n}\n\nlet cached: RelevanceProvider | null | undefined;\n\n/** Reset the memoized provider (tests only). */\nexport function resetRelevanceProviderCache(): void {\n cached = undefined;\n}\n\n/**\n * Load the optional relevance provider. Memoized per process; returns `null`\n * when disabled, not installed, or the module fails to load or violates the\n * contract — callers treat `null` as \"no analysis\" and proceed unchanged.\n */\nexport async function loadRelevanceProvider(): Promise<RelevanceProvider | null> {\n if (cached !== undefined) return cached;\n cached = null;\n if (disabled()) return cached;\n for (const p of candidatePaths()) {\n if (!fs.existsSync(p)) continue;\n try {\n const mod = (await import(pathToFileURL(p).href)) as {\n createRelevanceProvider?: () => RelevanceProvider;\n };\n const provider = mod.createRelevanceProvider?.();\n if (provider && typeof provider.version === 'function' && typeof provider.analyzeQuery === 'function') {\n cached = provider;\n return cached;\n }\n } catch {\n // A broken module must never break ask/capsule — fall through to null.\n }\n }\n return cached;\n}\n\n/** Sanitized module ranking, ready for `queryGraph({ ranked })`. */\nexport interface SanitizedRank {\n version: string;\n hasContent: boolean;\n seeds: RankedSeed[];\n conceptMap: string[];\n}\n\nconst MAX_RANK_SEEDS = 64;\nconst MAX_CONCEPT_LINES = 24;\nconst MAX_WHY_LEN = 240;\nconst MAX_LINE_LEN = 400;\n\n/** Printable one-line string, control characters stripped, length-capped. */\nfunction cleanLine(raw: unknown, cap: number): string {\n return String(raw ?? '')\n .replace(/[\\u0000-\\u001F\\u007F]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, cap);\n}\n\n/**\n * Enforce the trust boundary on a provider ranking (exported for tests).\n * Seed ids must name symbols the LOADED graph actually has — a module can\n * order the host's own symbols, never invent one — and every string the\n * capsule will print is stripped and capped. Malformed entries drop; a\n * malformed envelope drops the whole ranking (→ mechanical fallback).\n */\nexport function sanitizeRank(raw: RankResult, validIds: ReadonlySet<string>): SanitizedRank | null {\n if (!raw || typeof raw.version !== 'string' || typeof raw.hasContent !== 'boolean') return null;\n if (!Array.isArray(raw.seeds) || !Array.isArray(raw.conceptMap)) return null;\n const seen = new Set<string>();\n const seeds: RankedSeed[] = [];\n for (const s of raw.seeds) {\n const id = typeof s?.id === 'string' ? s.id : '';\n const score = Number(s?.score);\n if (!id || !validIds.has(id) || seen.has(id)) continue;\n if (!Number.isFinite(score) || score <= 0) continue;\n seen.add(id);\n seeds.push({ id, score, why: cleanLine(s.why, MAX_WHY_LEN) });\n if (seeds.length >= MAX_RANK_SEEDS) break;\n }\n const conceptMap = raw.conceptMap\n .map((l) => cleanLine(l, MAX_LINE_LEN))\n .filter((l) => l.length > 0)\n .slice(0, MAX_CONCEPT_LINES);\n return { version: raw.version.slice(0, 120), hasContent: raw.hasContent, seeds, conceptMap };\n}\n\n/** Per-graph symbol view for the ranker, cached on graph object identity. */\nconst symbolViewCache = new WeakMap<object, { symbols: RankableSymbol[]; ids: Set<string> }>();\n\nfunction symbolViewOf(graph: {\n nodes: Array<{ id: string; name: string; qualifiedName: string; file: string; kind: string; importance: number }>;\n}): { symbols: RankableSymbol[]; ids: Set<string> } {\n const hit = symbolViewCache.get(graph);\n if (hit) return hit;\n const symbols: RankableSymbol[] = [];\n const ids = new Set<string>();\n for (const n of graph.nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n symbols.push({ id: n.id, name: n.name, qualifiedName: n.qualifiedName, file: n.file, importance: n.importance });\n ids.add(n.id);\n }\n const view = { symbols, ids };\n symbolViewCache.set(graph, view);\n return view;\n}\n\n/**\n * Rank a question over a graph's symbols via the installed module. Returns\n * `null` when no module is installed, the installed module predates the\n * ranking API, or its output fails sanitization — callers fall back to the\n * host's mechanical matcher and proceed unchanged. Every failure path is a\n * degrade, never an error.\n */\nexport async function rankQuestion(\n graph: { nodes: Array<{ id: string; name: string; qualifiedName: string; file: string; kind: string; importance: number }> },\n question: string,\n opts: { limit?: number; priorQuestion?: string | null; topicTags?: Map<string, readonly string[]> | null } = {},\n): Promise<SanitizedRank | null> {\n const provider = await loadRelevanceProvider();\n if (!provider || typeof provider.rankSymbols !== 'function') return null;\n try {\n const { symbols, ids } = symbolViewOf(graph);\n const topicTags = opts.topicTags ? Object.fromEntries(opts.topicTags) : null;\n const raw = provider.rankSymbols(question, symbols, {\n limit: opts.limit,\n priorQuestion: opts.priorQuestion ?? null,\n topicTags,\n });\n return sanitizeRank(raw, ids);\n } catch {\n return null;\n }\n}\n\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { serializeGraph } from './serialize.js';\nimport { mapFileExists, snapshotPathFor, writeGraphSnapshot } from './snapshot.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport { globalGraphPath, globalGraphPathForRef, repositoryStoreDir } from '../runtime/paths.js';\nimport { deleteTagsSidecarFor } from './relevance-enrich.js';\nimport { detectGitRef } from '../runtime/git-ref.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Graph artifact layout (Fusion Runtime Phase 1).\n *\n * By default the code map lives in the **global** application store\n * (XDG / Application Support), keyed by repository id — not inside the repo.\n * That keeps `vg` / `vg serve` / auto-refresh from dirtying the working tree.\n *\n * Legacy in-repo path `.vibgrate/graph.json` is still **read** when present\n * (migration), and is still the write target when:\n * - `VIBGRATE_GRAPH_IN_REPO=1` (or true/yes), or\n * - callers pass an explicit `graphPath` / `--graph`.\n *\n * `vg share` continues to opt into a committed in-repo map by writing under\n * `.vibgrate/` (and rewriting its gitignore).\n */\n\nexport interface WriteOptions {\n root: string;\n html?: boolean; // default true\n report?: boolean; // default true\n graphPath?: string; // override graph.json path\n}\n\nexport interface WrittenArtifacts {\n graphPath: string;\n reportPath?: string;\n htmlPath?: string;\n factsPath?: string;\n}\n\nexport function vibgrateDir(root: string): string {\n return path.join(root, '.vibgrate');\n}\n\n/** Historical in-repo map path (still read as a fallback). */\nexport function legacyGraphPath(root: string): string {\n return path.join(vibgrateDir(root), 'graph.json');\n}\n\n/**\n * When true, default writes go to `.vibgrate/graph.json` (pre–Phase-1 layout).\n * Useful for CI that asserts in-repo artifacts, and for `vg share` workflows.\n */\nexport function preferInRepoGraph(env: NodeJS.ProcessEnv = process.env): boolean {\n const v = env.VIBGRATE_GRAPH_IN_REPO?.trim().toLowerCase();\n return v === '1' || v === 'true' || v === 'yes';\n}\n\n/**\n * Default **write** path for the map. Global store unless the operator opts\n * into the legacy in-repo layout. When git is available, prefer a\n * branch-keyed snapshot (Fusion §4.1.1) so switching branches does not\n * overwrite another ref's on-disk map.\n */\nexport function defaultGraphPath(root: string, env: NodeJS.ProcessEnv = process.env): string {\n if (preferInRepoGraph(env)) return legacyGraphPath(root);\n const { ref, kind } = detectGitRef(root);\n if (kind !== 'none' && ref) return globalGraphPathForRef(root, ref, env);\n return globalGraphPath(root, 'current', env);\n}\n\n/**\n * Resolve where to **read** the map from.\n * Order: explicit override → legacy in-repo when `VIBGRATE_GRAPH_IN_REPO` is set\n * → branch-keyed global (if on a git ref) → `current` global snapshot →\n * legacy in-repo → default write path.\n *\n * The in-repo env short-circuit matters for CI and the release benchmark: they\n * force portable `.vibgrate/graph.json` artifacts and must not pay a synchronous\n * `git rev-parse` (or prefer a leftover global snapshot) on every resolve.\n */\nexport function resolveGraphPath(root: string, override?: string, env: NodeJS.ProcessEnv = process.env): string {\n if (override?.trim()) return path.resolve(override.trim());\n if (preferInRepoGraph(env)) {\n const legacy = legacyGraphPath(root);\n if (fs.existsSync(legacy)) return legacy;\n return legacy;\n }\n const { ref, kind } = detectGitRef(root);\n if (kind !== 'none' && ref) {\n const branchPath = globalGraphPathForRef(root, ref, env);\n if (mapFileExists(branchPath)) return branchPath;\n }\n const globalPath = globalGraphPath(root, 'current', env);\n if (mapFileExists(globalPath)) return globalPath;\n const legacy = legacyGraphPath(root);\n if (fs.existsSync(legacy)) return legacy;\n return defaultGraphPath(root, env);\n}\n\n/**\n * By default the graph artifacts are *local*: builds and auto-refreshes rewrite\n * them constantly, and without an ignore file every `vg ask`/`vg serve` leaves\n * the branch dirty (untracked or modified `.vibgrate/` files) — irritating for\n * humans and a source of junk commits from AI agents. So the first time vg\n * writes into `.vibgrate/` it also drops a `.gitignore` covering the graph\n * artifacts, the cache, and itself.\n *\n * Deliberately create-once: an existing `.vibgrate/.gitignore` is NEVER\n * touched, whatever its content — `vg share` owns it after opt-in (rewritten to\n * commit `graph.json`), and a user-managed file (even an empty one) is theirs.\n * Scanner artifacts meant for git (`baseline.json`, `standards.json`,\n * `attestation.intoto.jsonl`) are intentionally not listed.\n *\n * With the global store default, this gitignore is only created when something\n * is still written under `.vibgrate/` (in-repo mode or other in-repo writers).\n */\nconst DEFAULT_GITIGNORE = [\n '# Created by vg — local graph artifacts stay out of git by default.',\n '# Run `vg share` to commit the map for your team (it rewrites this file).',\n '# vg appends newly-introduced local artifacts to this list while this',\n '# header line stays; remove the header (or empty the file) to manage the',\n '# ignores yourself and vg will never touch it again.',\n '.gitignore',\n 'cache/',\n 'graph.json',\n 'graph.snap',\n 'graph.tags.snap',\n // Binary semantic index next to the map (never model-named; never under cache/).\n 'embeddings',\n 'graph.html',\n 'GRAPH_REPORT.md',\n 'facts.jsonl',\n 'mcp-navigation.json',\n // Machine-local telemetry the LSP/`vg code` accrue over time — never meant\n // for git: score-history.jsonl is per-machine trend data (lsp/score-history.ts),\n // run-outcomes.jsonl is per-machine agent-run telemetry (code/run-outcome.ts).\n // Neither is a snapshot artifact like scan_result.json/baseline.json, which\n // are intentionally left out of this list for a user to commit if they choose.\n 'score-history.jsonl',\n // Per-machine drifted-dependency snapshot behind the inline \"new\" marker\n // (lsp/inventory-history.ts). ignore.json is deliberately NOT here — an\n // ignore with a reason is a team decision that belongs in review.\n 'inline-inventory.json',\n 'run-outcomes.jsonl',\n // Standing approval rules are one developer's consent — sharing them via git\n // would silently grant their \"Always allow\" decisions to every teammate's\n // agent runs (code/approvals.ts).\n 'code-approvals.json',\n // Isolated worktree checkouts for VG Code worktree sessions — full working\n // copies that must never be committed into the repository that hosts them\n // (code/worktree-session.ts).\n 'worktrees',\n];\n\n/** Marks a .vibgrate/.gitignore as vg-authored (safe to keep current). */\nconst GITIGNORE_MARKER = /^# Created (once )?by vg\\b/;\n\nexport function ensureVibgrateGitignore(root: string): void {\n const file = path.join(vibgrateDir(root), '.gitignore');\n fs.mkdirSync(vibgrateDir(root), { recursive: true });\n if (!fs.existsSync(file)) {\n fs.writeFileSync(file, `${DEFAULT_GITIGNORE.join('\\n')}\\n`);\n return;\n }\n // A vg-authored .gitignore written before an entry joined DEFAULT_GITIGNORE\n // would keep tracking the newer machine-local files (e.g.\n // code-approvals.json — one developer's consent must not ride into the team\n // repo), so vg keeps ITS OWN file current: entries are appended while the\n // vg header is present. A file without the header — including an emptied\n // one — is the user's, and is never touched (the documented opt-out).\n const existing = fs.readFileSync(file, 'utf8');\n if (!GITIGNORE_MARKER.test(existing.split(/\\r?\\n/, 1)[0] ?? '')) return;\n const have = new Set(existing.split(/\\r?\\n/).map((l) => l.trim()));\n const missing = DEFAULT_GITIGNORE.filter((entry) => !entry.startsWith('#') && !have.has(entry));\n if (missing.length) {\n fs.writeFileSync(file, `${existing.replace(/\\n*$/, '\\n')}${missing.join('\\n')}\\n`);\n }\n}\n\n/**\n * Directory for companion artifacts (report, html, facts) next to the map.\n * Global maps → repository store root; in-repo maps → `.vibgrate/`.\n */\nexport function companionArtifactDir(root: string, graphPath: string, env: NodeJS.ProcessEnv = process.env): string {\n const resolved = path.resolve(graphPath);\n const legacy = path.resolve(legacyGraphPath(root));\n if (resolved === legacy) return vibgrateDir(root);\n const globalDefault = path.resolve(globalGraphPath(root, 'current', env));\n if (resolved === globalDefault) return repositoryStoreDir(root, env);\n // Custom --graph: keep companions next to the map file.\n return path.dirname(resolved);\n}\n\nexport function writeArtifacts(graph: VgGraph, options: WriteOptions): WrittenArtifacts {\n const graphPath = options.graphPath ?? defaultGraphPath(options.root);\n const companions = companionArtifactDir(options.root, graphPath);\n const inRepo = isPathInside(companions, options.root) || isPathInside(graphPath, options.root);\n\n fs.mkdirSync(path.dirname(graphPath), { recursive: true });\n fs.mkdirSync(companions, { recursive: true });\n\n // Only drop `.vibgrate/.gitignore` when we still touch the in-repo layout.\n if (inRepo && isPathInside(companions, vibgrateDir(options.root))) {\n ensureVibgrateGitignore(options.root);\n } else if (path.resolve(graphPath) === path.resolve(legacyGraphPath(options.root))) {\n ensureVibgrateGitignore(options.root);\n }\n\n // Global-store maps are machine-consumed only, so the snapshot IS the map\n // there — skipping the pretty-JSON serialize is the bulk of the write cost\n // on large repos. Everywhere a human (or git) can see the file — legacy\n // in-repo layout, VIBGRATE_GRAPH_IN_REPO, `vg share`, an explicit --graph\n // path — the canonical graph.json is still written, with the snapshot as a\n // sidecar cache.\n const storeMode = isPathInside(graphPath, repositoryStoreDir(options.root));\n\n // A (re)written graph at this path is a NEW graph: drop the relevance-tags\n // sidecar bound to the previous content so nothing stale can outlive its\n // graph (the sidecar would also self-invalidate via corpusHash, but a\n // removed/replaced graph must take its derived artifacts with it).\n deleteTagsSidecarFor(graphPath);\n\n if (storeMode) {\n if (!writeGraphSnapshot(graphPath, graph, { standalone: true })) {\n // Store not writable for the binary — fall back to the JSON write below\n // rather than losing the build.\n } else {\n // Drop any JSON left by an older CLI at this path so a downgrade can\n // never silently serve a stale map from beside a newer snapshot.\n fs.rmSync(graphPath, { force: true });\n }\n }\n\n if (!storeMode || !fs.existsSync(snapshotPathFor(graphPath))) {\n // Atomic write (temp + rename): `vg serve` hot-reloads the map on mtime\n // change, so a rebuild — including its own in-process auto-refresh — must\n // never expose a half-written file to a concurrent reader.\n const tmp = `${graphPath}.${process.pid}.tmp`;\n try {\n fs.writeFileSync(tmp, serializeGraph(graph));\n fs.renameSync(tmp, graphPath);\n } catch (err) {\n fs.rmSync(tmp, { force: true });\n throw err;\n }\n // Binary sidecar cache for fast loads; best-effort, JSON stays canonical.\n writeGraphSnapshot(graphPath, graph);\n }\n\n const written: WrittenArtifacts = {\n graphPath: storeMode && !fs.existsSync(graphPath) ? snapshotPathFor(graphPath) : graphPath,\n };\n\n if (options.report !== false) {\n const reportPath = path.join(companions, 'GRAPH_REPORT.md');\n fs.writeFileSync(reportPath, renderReport(graph));\n written.reportPath = reportPath;\n }\n\n if (options.html !== false) {\n const htmlPath = path.join(companions, 'graph.html');\n fs.writeFileSync(htmlPath, renderHtml(graph));\n written.htmlPath = htmlPath;\n }\n\n // facts.jsonl (deterministic NDJSON) when facts were derived.\n if (graph.facts && graph.facts.length) {\n const factsPath = path.join(companions, 'facts.jsonl');\n fs.writeFileSync(factsPath, graph.facts.map((f) => JSON.stringify(f)).join('\\n') + '\\n');\n written.factsPath = factsPath;\n }\n\n return written;\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n","/**\n * Graph enrichment via the optional relevance provider: per-node TOPIC TAGS,\n * stored as a binary sidecar BOUND TO ONE EXACT GRAPH.\n *\n * When the installed provider exposes `tagNode`, every graph node gets a\n * deterministic topic tag set derived from path/identifier evidence\n * (\"src/payments/DirectDebitMandate.ts\" → [\"payments\"]). Query-time ranking\n * then adds a bounded affinity bonus when the question's inferred topics\n * intersect a node's tags.\n *\n * Storage contract (the part that keeps everything in step):\n *\n * - Tags NEVER enter `graph.json` — byte-identical output for identical\n * input is a hard invariant of `vg build`.\n * - The sidecar lives BESIDE the resolved graph artifact\n * (`<id>.graph.tags.snap` next to `<id>.graph.json` / `.graph.snap`).\n * Graphs are branch-keyed in the global repository store (Fusion §4.1.1),\n * so switching branches resolves a different graph file — and therefore a\n * different sidecar — with zero extra bookkeeping. Legacy in-repo maps get\n * `.vibgrate/graph.tags.snap` (gitignored alongside `graph.snap`).\n * - The binding is CONTENT identity, not path or time: the header records\n * the graph's `provenance.corpusHash` (blake3 over the included file set)\n * and is trusted only when it matches the LOADED graph. A rebuild, a\n * branch switch served through the same path, or a hand-swapped file all\n * invalidate it exactly; anything published downstream (vgd scans) that\n * carries the graph's corpusHash can verify the tags belong to it.\n * - The provider version and engine VERSION are recorded and must match — a\n * kernel/pack or CLI upgrade recomputes cleanly.\n * - Any mismatch, torn file (CRC), decode error, or provider fault degrades\n * to recompute-or-null; a sidecar problem must never break ranking.\n * - Writes are atomic (temp + rename) and best-effort; the graph write path\n * (engine/artifacts.ts) deletes the sidecar whenever the graph at that\n * path is rewritten or removed, so an orphaned sidecar cannot outlive its\n * graph.\n *\n * Format (mirrors engine/snapshot.ts conventions): MAGIC (\"VGTAGS1\\0\") ·\n * u32LE header length · msgpack header {engine, provider, corpusHash, crc32}\n * · msgpack payload (node id → tags, sorted by id). Explicit little-endian,\n * pure-JS msgpackr, fresh Packr per encode/decode — no platform variance.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as zlib from 'node:zlib';\nimport { Packr } from 'msgpackr';\nimport { loadRelevanceProvider } from './relevance-provider.js';\nimport { resolveGraphPath } from './artifacts.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\nconst MAGIC = Buffer.from('VGTAGS1\\0', 'latin1');\n\n/** node:zlib gained crc32 in 22.2; engines pins Node >= 22 so it's present,\n * but guard anyway (same posture as engine/snapshot.ts). */\nconst crc32: (data: Uint8Array) => number = zlib.crc32 ?? (() => 0);\n\ninterface TagsHeader {\n engine: string;\n provider: string;\n corpusHash: string;\n crc32: number;\n}\n\nfunction newPackr(): Packr {\n return new Packr({ useRecords: true });\n}\n\n/** Sidecar path for a resolved graph artifact path. */\nexport function tagsSidecarPathFor(graphPath: string): string {\n return graphPath.endsWith('.json') ? `${graphPath.slice(0, -5)}.tags.snap` : `${graphPath}.tags.snap`;\n}\n\n/** Remove the tags sidecar for a graph path (graph rewrite/removal hook). */\nexport function deleteTagsSidecarFor(graphPath: string): void {\n try {\n fs.rmSync(tagsSidecarPathFor(graphPath), { force: true });\n } catch {\n /* best-effort — a locked file self-invalidates via corpusHash anyway */\n }\n}\n\nfunction readSidecar(file: string, expect: { provider: string; corpusHash: string }): Record<string, string[]> | null {\n try {\n if (!fs.existsSync(file)) return null;\n const raw = fs.readFileSync(file);\n if (raw.length < MAGIC.length + 4 || !raw.subarray(0, MAGIC.length).equals(MAGIC)) return null;\n const headerLen = raw.readUInt32LE(MAGIC.length);\n const headerStart = MAGIC.length + 4;\n if (raw.length < headerStart + headerLen) return null;\n const header = newPackr().unpack(raw.subarray(headerStart, headerStart + headerLen)) as TagsHeader;\n if (header.engine !== VERSION) return null;\n if (header.provider !== expect.provider) return null;\n if (header.corpusHash !== expect.corpusHash) return null;\n const payload = raw.subarray(headerStart + headerLen);\n if ((crc32(payload) >>> 0) !== (header.crc32 >>> 0)) return null;\n const tags = newPackr().unpack(payload) as Record<string, string[]>;\n return tags && typeof tags === 'object' ? tags : null;\n } catch {\n return null;\n }\n}\n\nfunction writeSidecar(file: string, meta: { provider: string; corpusHash: string }, tags: Record<string, string[]>): void {\n try {\n // Deterministic payload: sorted node ids.\n const sorted = Object.fromEntries(Object.entries(tags).sort(([a], [b]) => (a < b ? -1 : 1)));\n const payload = newPackr().pack(sorted);\n const header = newPackr().pack({\n engine: VERSION,\n provider: meta.provider,\n corpusHash: meta.corpusHash,\n crc32: crc32(payload) >>> 0,\n } satisfies TagsHeader);\n const lenBuf = Buffer.alloc(4);\n lenBuf.writeUInt32LE(header.length);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.${process.pid}.tmp`;\n fs.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, Buffer.from(header), Buffer.from(payload)]));\n fs.renameSync(tmp, file);\n } catch {\n // Best-effort: a full disk or read-only store never fails a query.\n }\n}\n\n/**\n * Topic tags for every scorable node of THIS graph, computed through the\n * provider and cached in the graph's own sidecar. Returns `null` when no\n * provider (or none with `tagNode`) is active — callers treat that as \"no\n * enrichment\" and proceed unchanged.\n *\n * `graphPath` should be the path the graph was actually loaded from (the MCP\n * server and `vg ask` pass it); when omitted it is re-resolved from the root\n * with the same branch-keyed rules `loadGraph` uses, so the sidecar always\n * sits beside the graph the current workspace state resolves to.\n */\nexport async function loadTopicTags(\n graph: VgGraph,\n root: string,\n graphPath?: string,\n): Promise<Map<string, readonly string[]> | null> {\n const provider = await loadRelevanceProvider();\n if (!provider?.tagNode) return null;\n let providerVersion: string;\n try {\n providerVersion = provider.version();\n } catch {\n return null;\n }\n const corpusHash = graph.provenance?.corpusHash;\n if (!corpusHash) return null; // no content identity → no cacheable binding\n\n const file = tagsSidecarPathFor(graphPath?.trim() ? path.resolve(graphPath) : resolveGraphPath(root));\n const cached = readSidecar(file, { provider: providerVersion, corpusHash });\n if (cached) {\n const tags = new Map<string, readonly string[]>();\n for (const [id, t] of Object.entries(cached)) if (t.length) tags.set(id, t);\n return tags;\n }\n\n const record: Record<string, string[]> = {};\n const tags = new Map<string, readonly string[]>();\n try {\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const computed = provider.tagNode({ qualifiedName: node.qualifiedName, file: node.file }) ?? [];\n // Sanitize at the trust boundary: strings only, lowercased, capped.\n const clean = computed\n .filter((t) => typeof t === 'string' && t.length > 0)\n .map((t) => t.toLowerCase())\n .slice(0, 3);\n record[node.id] = clean;\n if (clean.length) tags.set(node.id, clean);\n }\n } catch {\n return null; // a faulting provider must never break ranking\n }\n writeSidecar(file, { provider: providerVersion, corpusHash }, record);\n return tags;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/code/prompt.ts","../src/code/apply.ts","../src/code/diff.ts","../src/code/providers.ts"],"names":["i","j"],"mappings":"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","file":"chunk-SHD5TCZ5.js","sourcesContent":["/**\n * Prompt assembly with cache-stable ordering (VG-CLI-CODE §5.1).\n *\n * The fast coding tools lean hard on prompt caching — cached tokens are roughly\n * an order of magnitude cheaper and skip re-encoding, so hit-rate is a\n * first-class speed lever. A cache only helps if the *prefix* is byte-stable\n * across turns, which makes prompt ordering a scheduling constraint, not a\n * cosmetic choice: put the invariant material (the instruction contract + the\n * repo-derived context) first and the volatile turn-specific ask last. This\n * module is the single place that ordering is enforced, so every provider\n * inherits it.\n */\n\nimport type { ChatMessage, CodeContext } from './types.js';\n\n/**\n * The system contract for the planner. Intentionally fixed (no interpolation)\n * so it is a perfectly stable cache prefix. It pins the edit *format* the\n * deterministic applier expects — the model's only job is to emit these blocks.\n */\nexport const CODE_SYSTEM_PROMPT = [\n 'You are a precise code-editing assistant operating inside the Vibgrate CLI.',\n 'You are given repository context derived from a deterministic code graph, then a task.',\n 'Propose the smallest correct change. Do not restate unchanged code.',\n '',\n 'Reply ONLY with edit blocks in this exact format, one per change:',\n '',\n '<path/to/file>',\n '<<<<<<< SEARCH',\n '<exact current lines to find>',\n '=======',\n '<replacement lines>',\n '>>>>>>> REPLACE',\n '',\n 'The SEARCH text must match the current file (whitespace differences are tolerated).',\n 'To add a new file use:',\n 'CREATE <path/to/file>',\n '<full file body>',\n 'END CREATE',\n 'To remove a file use: DELETE <path/to/file>',\n '',\n 'Respect every hard constraint in the context. Keep edits minimal and self-consistent.',\n].join('\\n');\n\n/**\n * Build the chat messages for a planning turn, in cache-stable order:\n * 1. system contract (fixed)\n * 2. repository context (stable for the repo/turn — the big, reusable prefix)\n * 3. the task instruction (volatile — always last)\n *\n * Keeping the volatile instruction in its own trailing user turn maximizes the\n * reusable prefix when the same repo is edited across multiple asks.\n */\nexport function buildMessages(context: CodeContext): ChatMessage[] {\n return [\n { role: 'system', content: CODE_SYSTEM_PROMPT },\n { role: 'user', content: context.rendered },\n { role: 'user', content: `Now produce the edit blocks for: ${context.instruction}` },\n ];\n}\n\n/**\n * The system contract for the agentic loop (tool-calling). Fixed text → stable\n * cache prefix. Full coding agent (Claude Code / Codex / Cline / OpenHands class):\n * free tool use, Markdown answers, edits only via tools — never a forced edit IR.\n */\nexport const AGENT_SYSTEM_PROMPT = [\n 'You are VG Code — a full coding agent in a real repository (parity with Claude Code / Codex / Cline / OpenHands).',\n 'You handle every intent: questions, locate/search, design discussion, and multi-file edits. The host never forces an edit format on your turn — you choose tools.',\n 'Most requests change application source. Prefer editing code under packages/src, not package manifests,',\n 'unless the user asks for dependency or packaging work.',\n '',\n 'You receive a Task Capsule (ranked symbols + source slices) as first-turn evidence. Use it;',\n 'it does not replace tools when you need more context.',\n '',\n 'Tools: search_code (graph + literal string/URL sweep — like workspace Find), read_file, list_files, graph_impact,',\n 'library_docs, edit_file, create_file, delete_file, apply_patch, run_command, set_progress, inspect_task,',\n 'inspect_change, verify_change, ask_user, finish, abort.',\n '',\n 'You also always have the local Vibgrate AI Context MCP tools (namespaced',\n 'mcp__vibgrate__*): search_symbols, query_graph, orient, get_node, impact_of,',\n 'library_docs, check_drift, and the rest of `vg serve`. Prefer them for deep',\n 'graph navigation, docs, and drift. Project MCP servers may add more mcp__* tools.',\n '',\n '## How to work',\n '- Search or read before you edit. Never invent file contents.',\n '- Smallest correct change; check graph_impact / mcp__vibgrate__impact_of before touching shared hubs.',\n '- edit_file SEARCH must match current file (whitespace-flexible). Prefer apply_patch for multi-file edits.',\n '- Run tests or build when useful; use verify_change after multi-file work.',\n '- For multi-step tasks, call set_progress early with a short plan; mark items done as you complete them.',\n '- Mutating tools and shell need user approval — adapt if declined.',\n '',\n '## Answers and task space',\n '- Call finish with a Markdown summary: what you did or found, key `file:line` refs, next steps.',\n '- Q&A / locate / explain: use search_code (pass the exact needle, e.g. stripe or \"stripe\"), then finish with Markdown.',\n '- Do not invent PatchIR, dummy edits, or raw JSON as the user-facing answer. Edits only via edit_file / apply_patch tools.',\n '',\n '## When stuck',\n '- If intent, scope, or trade-off is ambiguous, call ask_user with one clear question (optional options).',\n '- Prefer ask_user over abort when the user can unblock you. Do not guess product requirements.',\n '- abort only when the request is impossible after clarification or lookup.',\n '',\n 'Never dump raw JSON schemas, PatchIR templates, or tool wire formats as the user-facing answer.',\n].join('\\n');\n\n/** Build the opening messages for an agent run: system contract + graph-grounded context + task. */\nexport function buildAgentMessages(context: CodeContext): ChatMessage[] {\n return [\n { role: 'system', content: AGENT_SYSTEM_PROMPT },\n { role: 'user', content: context.rendered },\n { role: 'user', content: `Task: ${context.instruction}` },\n ];\n}\n","/**\n * The deterministic fast-apply merge engine (VG-CLI-CODE §4).\n *\n * Speed in the fast coding tools comes from letting the planner emit a *terse*\n * edit instead of rewriting a whole file; correctness comes from applying that\n * edit **deterministically and scoped**, never by letting the model free-hand\n * the merge. This module is that deterministic floor: it parses the\n * search/replace edit form and applies it with three escalating match\n * strategies — exact, whitespace-flexible, then graph-span-scoped — so an\n * ambiguous SEARCH is resolved to the symbol the planner actually named rather\n * than the first textual hit. No model is required to apply an edit; a hosted\n * fast-apply model is only ever an *acceleration* over this same contract.\n *\n * Everything here is pure and deterministic: identical (content, edit) always\n * yields the identical outcome, which is what makes it unit- and\n * benchmark-testable offline.\n */\n\nimport type { CodeEdit, EditOutcome } from './types.js';\n\n/** A symbol span the graph knows about, used to disambiguate a SEARCH match. */\nexport interface SymbolSpan {\n /** Qualified name, matched against `anchorSymbol`. */\n qualifiedName: string;\n file: string;\n /** 1-based inclusive line range. */\n start: number;\n end: number;\n}\n\n/**\n * Parse a model's reply into structured edits. The accepted form is the\n * widely-supported search/replace block (robust to surrounding prose and code\n * fences), plus explicit whole-file create/delete markers:\n *\n * ```\n * path/to/file.ts\n * <<<<<<< SEARCH\n * old code\n * =======\n * new code\n * >>>>>>> REPLACE\n * ```\n *\n * `CREATE path/to/new.ts` … `END CREATE` wraps a new file's whole body;\n * `DELETE path/to/gone.ts` removes a file. Parsing is forgiving of blank lines\n * and fences but strict about the block markers, so a malformed block surfaces\n * as an `invalid` outcome at apply time rather than silently corrupting a file.\n */\nexport function parseEdits(text: string): CodeEdit[] {\n const edits: CodeEdit[] = [];\n const lines = text.split('\\n');\n let i = 0;\n let pendingFile = '';\n\n const isFence = (s: string): boolean => /^\\s*```/.test(s);\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Whole-file create: `CREATE <path>` … `END CREATE`.\n const create = /^\\s*CREATE\\s+(\\S.*?)\\s*$/.exec(line);\n if (create) {\n const file = create[1];\n const body: string[] = [];\n i++;\n while (i < lines.length && !/^\\s*END CREATE\\s*$/.test(lines[i])) {\n if (!isFence(lines[i])) body.push(lines[i]);\n i++;\n }\n i++; // consume END CREATE\n edits.push({ op: 'create', file, content: body.join('\\n') });\n pendingFile = '';\n continue;\n }\n\n // Whole-file delete: `DELETE <path>`.\n const del = /^\\s*DELETE\\s+(\\S.*?)\\s*$/.exec(line);\n if (del) {\n edits.push({ op: 'delete', file: del[1] });\n i++;\n pendingFile = '';\n continue;\n }\n\n // Search/replace block. The file path is the most recent non-fence,\n // non-blank line before the SEARCH marker (or an inline `path` on it).\n if (/^\\s*<{5,}\\s*SEARCH/.test(line)) {\n const file = pendingFile;\n const search: string[] = [];\n const replace: string[] = [];\n i++;\n while (i < lines.length && !/^\\s*={5,}\\s*$/.test(lines[i])) {\n search.push(lines[i]);\n i++;\n }\n i++; // consume =======\n while (i < lines.length && !/^\\s*>{5,}\\s*REPLACE/.test(lines[i])) {\n replace.push(lines[i]);\n i++;\n }\n i++; // consume >>>>>>> REPLACE\n edits.push({\n op: 'replace',\n file,\n search: search.join('\\n'),\n replace: replace.join('\\n'),\n anchorSymbol: undefined,\n });\n continue;\n }\n\n // Track the most recent file-path candidate: a lone token that looks like a\n // path (has a slash or a file extension) and isn't a fence/marker.\n const trimmed = line.trim();\n if (trimmed && !isFence(line) && looksLikePath(trimmed)) pendingFile = trimmed.replace(/[:`]+$/, '');\n i++;\n }\n\n return edits;\n}\n\nfunction looksLikePath(s: string): boolean {\n if (/\\s/.test(s.replace(/:$/, ''))) return false; // paths don't contain spaces\n return /\\//.test(s) || /\\.[A-Za-z0-9]{1,8}:?$/.test(s);\n}\n\n/**\n * Apply a single edit to a file's current content (or `null` when the file does\n * not exist). Pure: returns the new content and an outcome; never touches disk.\n * The `spans` are the graph's symbol spans for this file — when a SEARCH is\n * textually ambiguous, a match inside the `anchorSymbol` span wins, which is how\n * the graph makes a terse edit land where the planner meant it to.\n */\nexport function applyEdit(\n content: string | null,\n edit: CodeEdit,\n spans: SymbolSpan[] = [],\n): { content: string | null; outcome: EditOutcome } {\n if (edit.op === 'create') {\n if (content !== null && content !== edit.content) {\n return { content, outcome: { edit, status: 'conflict', reason: `${edit.file} already exists — refusing to overwrite it with a create; use a replace edit instead` } };\n }\n return { content: edit.content, outcome: { edit, status: content === edit.content ? 'no-op' : 'applied', matchedBy: 'exact' } };\n }\n\n if (edit.op === 'delete') {\n if (content === null) return { content: null, outcome: { edit, status: 'no-op', reason: `${edit.file} does not exist — nothing to delete` } };\n return { content: null, outcome: { edit, status: 'applied', matchedBy: 'exact' } };\n }\n\n // op === 'replace'\n if (content === null) {\n return { content: null, outcome: { edit, status: 'not-found', reason: `${edit.file} does not exist — a replace needs an existing file (did you mean CREATE ${edit.file}?)` } };\n }\n if (edit.search === '') {\n // Empty SEARCH means \"prepend\" only when the file is empty; otherwise it is\n // ambiguous and we refuse rather than guess a location.\n if (content === '') return { content: edit.replace, outcome: { edit, status: 'applied', matchedBy: 'exact' } };\n return { content, outcome: { edit, status: 'invalid', reason: 'empty SEARCH on a non-empty file is ambiguous — quote the exact lines to replace' } };\n }\n if (edit.search === edit.replace) {\n return { content, outcome: { edit, status: 'no-op', reason: 'SEARCH and REPLACE are identical — no change' } };\n }\n\n const located = locate(content, edit.search, edit.anchorSymbol, spans, edit.file);\n if (located.kind === 'none') {\n return { content, outcome: { edit, status: 'not-found', reason: `the SEARCH text was not found in ${edit.file} — it must match the current file exactly (whitespace-flexible)` } };\n }\n if (located.kind === 'ambiguous') {\n return {\n content,\n outcome: {\n edit,\n status: 'ambiguous',\n reason: `the SEARCH text matches ${located.count} places in ${edit.file} — add more surrounding lines, or name the symbol so the graph can disambiguate`,\n },\n };\n }\n const next = content.slice(0, located.from) + edit.replace + content.slice(located.to);\n return { content: next, outcome: { edit, status: 'applied', matchedBy: located.matchedBy } };\n}\n\n/**\n * Apply a set of edits across a set of files. `read(file)` returns current\n * content or `null`. Edits are applied in the order given, threading each\n * file's evolving content so two edits to the same file compose. Returns, per\n * file, its before/after content and the per-edit outcomes — the dry-run\n * product the session turns into diffs. Deterministic given a deterministic\n * `read`.\n */\nexport function applyEdits(\n edits: CodeEdit[],\n read: (file: string) => string | null,\n spansByFile: (file: string) => SymbolSpan[] = () => [],\n): Map<string, { before: string | null; after: string | null; outcomes: EditOutcome[] }> {\n const state = new Map<string, { before: string | null; after: string | null; outcomes: EditOutcome[] }>();\n for (const edit of edits) {\n let entry = state.get(edit.file);\n if (!entry) {\n const before = read(edit.file);\n entry = { before, after: before, outcomes: [] };\n state.set(edit.file, entry);\n }\n const { content, outcome } = applyEdit(entry.after, edit, spansByFile(edit.file));\n entry.after = content;\n entry.outcomes.push(outcome);\n }\n return state;\n}\n\ntype Located =\n | { kind: 'unique'; from: number; to: number; matchedBy: 'exact' | 'whitespace' | 'graph-span' }\n | { kind: 'ambiguous'; count: number }\n | { kind: 'none' };\n\n/**\n * Find the SEARCH text in the content. Escalates: (1) exact substring; (2)\n * whitespace-flexible (indentation/trailing-space differences tolerated); and\n * when either is ambiguous, (3) narrow to the `anchorSymbol`'s graph span so the\n * intended occurrence wins. Line-oriented so offsets map back to real edits.\n */\nfunction locate(content: string, search: string, anchor: string | undefined, spans: SymbolSpan[], file: string): Located {\n const exact = allIndexes(content, search);\n if (exact.length === 1) return { kind: 'unique', from: exact[0], to: exact[0] + search.length, matchedBy: 'exact' };\n if (exact.length > 1) {\n const scoped = scopeToAnchor(content, exact.map((from) => ({ from, to: from + search.length })), anchor, spans, file);\n if (scoped) return { ...scoped, matchedBy: 'graph-span' };\n return { kind: 'ambiguous', count: exact.length };\n }\n\n // Whitespace-flexible: compare with runs of whitespace collapsed and each\n // line trimmed, then map the match back to real character offsets.\n const flex = flexIndexes(content, search);\n if (flex.length === 1) return { kind: 'unique', from: flex[0].from, to: flex[0].to, matchedBy: 'whitespace' };\n if (flex.length > 1) {\n const scoped = scopeToAnchor(content, flex, anchor, spans, file);\n if (scoped) return { ...scoped, matchedBy: 'graph-span' };\n return { kind: 'ambiguous', count: flex.length };\n }\n return { kind: 'none' };\n}\n\n/** Every start index of `needle` in `hay` (non-overlapping left-to-right). */\nfunction allIndexes(hay: string, needle: string): number[] {\n const out: number[] = [];\n if (needle === '') return out;\n let from = 0;\n for (;;) {\n const idx = hay.indexOf(needle, from);\n if (idx === -1) break;\n out.push(idx);\n from = idx + needle.length;\n }\n return out;\n}\n\n/**\n * Whitespace-flexible match: align the search's trimmed non-empty lines against\n * the content's lines, tolerating indentation and trailing-whitespace drift\n * (the single most common reason an otherwise-correct terse edit fails to\n * apply). Returns real character offset ranges for each full-block match.\n */\nfunction flexIndexes(content: string, search: string): { from: number; to: number }[] {\n const cLines = content.split('\\n');\n const sLines = search.split('\\n');\n // Trim a possible leading/trailing blank line from the search block.\n while (sLines.length && sLines[0].trim() === '') sLines.shift();\n while (sLines.length && sLines[sLines.length - 1].trim() === '') sLines.pop();\n if (sLines.length === 0) return [];\n const sNorm = sLines.map((l) => l.trim());\n\n // Precompute char offset of the start of each content line.\n const lineStart: number[] = [];\n let acc = 0;\n for (const l of cLines) {\n lineStart.push(acc);\n acc += l.length + 1; // +1 for the '\\n'\n }\n\n const out: { from: number; to: number }[] = [];\n for (let i = 0; i + sNorm.length <= cLines.length; i++) {\n let ok = true;\n for (let j = 0; j < sNorm.length; j++) {\n if (cLines[i + j].trim() !== sNorm[j]) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n const from = lineStart[i];\n const lastLine = i + sNorm.length - 1;\n const to = lineStart[lastLine] + cLines[lastLine].length; // end of the last matched line (exclusive of '\\n')\n out.push({ from, to });\n }\n return out;\n}\n\n/** If exactly one candidate falls inside the anchor symbol's span, pick it. */\nfunction scopeToAnchor(\n content: string,\n candidates: { from: number; to: number }[],\n anchor: string | undefined,\n spans: SymbolSpan[],\n file: string,\n): { kind: 'unique'; from: number; to: number } | null {\n if (!anchor) return null;\n const span = spans.find((s) => s.file === file && s.qualifiedName === anchor);\n if (!span) return null;\n const lineOf = lineIndexer(content);\n const inside = candidates.filter((c) => {\n const line = lineOf(c.from); // 1-based\n return line >= span.start && line <= span.end;\n });\n if (inside.length === 1) return { kind: 'unique', from: inside[0].from, to: inside[0].to };\n return null;\n}\n\n/** Returns a function mapping a char offset → 1-based line number. */\nfunction lineIndexer(content: string): (offset: number) => number {\n const starts: number[] = [0];\n for (let i = 0; i < content.length; i++) if (content[i] === '\\n') starts.push(i + 1);\n return (offset: number) => {\n // binary search for the greatest line start <= offset\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n };\n}\n","/**\n * Deterministic unified diff (VG-CLI-CODE §4.3).\n *\n * A `vg code` dry-run shows the human/agent exactly what would change *before*\n * anything is written — the \"inspect the proposal\" half of the governance\n * lifecycle. This is a small, dependency-free Myers-style line diff producing\n * standard unified-diff hunks. Identical (before, after) always renders the\n * identical text, so the dry-run output is stable and diff-able in tests and\n * benchmarks.\n */\n\n/** Render a unified diff for one file. Returns '' when there is no change. */\nexport function unifiedDiff(before: string | null, after: string | null, file: string, context = 3): string {\n if (before === after) return '';\n if (before === null) return newFileDiff(after ?? '', file);\n if (after === null) return deletedFileDiff(before, file);\n\n const a = splitLines(before);\n const b = splitLines(after);\n const ops = diffLines(a, b);\n const hunks = groupHunks(ops, context);\n if (hunks.length === 0) return '';\n\n const out: string[] = [`--- a/${file}`, `+++ b/${file}`];\n for (const h of hunks) {\n out.push(`@@ -${h.aStart},${h.aLen} +${h.bStart},${h.bLen} @@`);\n for (const line of h.lines) out.push(line);\n }\n return out.join('\\n');\n}\n\n/**\n * Whole-file create/delete bodies larger than this are summarized instead of\n * line-dumped. Small files stay fully visible for review; large page deletes\n * (hundreds/thousands of lines) only need path + line count in the transcript.\n */\nconst FULL_BODY_LINE_CAP = 40;\n\nfunction newFileDiff(after: string, file: string): string {\n const lines = splitLines(after);\n const out = [`--- /dev/null`, `+++ b/${file}`, `@@ -0,0 +1,${lines.length} @@`];\n if (lines.length > FULL_BODY_LINE_CAP) {\n out.push(`+… ${lines.length} lines added …`);\n return out.join('\\n');\n }\n for (const l of lines) out.push(`+${l}`);\n return out.join('\\n');\n}\n\nfunction deletedFileDiff(before: string, file: string): string {\n const lines = splitLines(before);\n const n = lines.length;\n const out = [`--- a/${file}`, `+++ /dev/null`, `@@ -1,${n} +0,0 @@`];\n // No — we do not need the full body in the panel when a page is deleted.\n // Undo still keeps FileChange.before; approval is path-only for delete_file.\n if (n > FULL_BODY_LINE_CAP) {\n out.push(`-… ${n} lines deleted …`);\n return out.join('\\n');\n }\n for (const l of lines) out.push(`-${l}`);\n return out.join('\\n');\n}\n\nfunction splitLines(s: string): string[] {\n if (s === '') return [];\n const lines = s.split('\\n');\n // A trailing newline yields a final '' element — drop it so line counts match.\n if (lines.length && lines[lines.length - 1] === '') lines.pop();\n return lines;\n}\n\ntype Op = { tag: 'eq' | 'del' | 'add'; line: string };\n\n/**\n * Line diff via LCS (dynamic programming). O(n·m) space is fine for source\n * files; the deterministic backtrace (favouring deletions before additions on\n * ties) keeps output stable.\n */\nfunction diffLines(a: string[], b: string[]): Op[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i][j] = a[i] === b[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n const ops: Op[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n ops.push({ tag: 'eq', line: a[i] });\n i++;\n j++;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n ops.push({ tag: 'del', line: a[i] });\n i++;\n } else {\n ops.push({ tag: 'add', line: b[j] });\n j++;\n }\n }\n while (i < n) ops.push({ tag: 'del', line: a[i++] });\n while (j < m) ops.push({ tag: 'add', line: b[j++] });\n return ops;\n}\n\ninterface Hunk {\n aStart: number;\n aLen: number;\n bStart: number;\n bLen: number;\n lines: string[];\n}\n\n/** Group the op stream into unified-diff hunks with `context` equal lines around changes. */\nfunction groupHunks(ops: Op[], context: number): Hunk[] {\n // Index of each op that is a change (del/add).\n const changeIdx = ops.map((o, i) => (o.tag === 'eq' ? -1 : i)).filter((i) => i >= 0);\n if (changeIdx.length === 0) return [];\n\n // Merge change indices into windows that share context.\n const windows: [number, number][] = [];\n let start = Math.max(0, changeIdx[0] - context);\n let end = Math.min(ops.length - 1, changeIdx[0] + context);\n for (let k = 1; k < changeIdx.length; k++) {\n const cs = Math.max(0, changeIdx[k] - context);\n const ce = Math.min(ops.length - 1, changeIdx[k] + context);\n if (cs <= end + 1) {\n end = ce;\n } else {\n windows.push([start, end]);\n start = cs;\n end = ce;\n }\n }\n windows.push([start, end]);\n\n const hunks: Hunk[] = [];\n // Running 1-based line numbers into a and b.\n let aLine = 1;\n let bLine = 1;\n let idx = 0;\n for (const [ws, we] of windows) {\n // advance line counters up to window start\n while (idx < ws) {\n const o = ops[idx];\n if (o.tag !== 'add') aLine++;\n if (o.tag !== 'del') bLine++;\n idx++;\n }\n const hunk: Hunk = { aStart: aLine, aLen: 0, bStart: bLine, bLen: 0, lines: [] };\n for (let k = ws; k <= we; k++) {\n const o = ops[k];\n if (o.tag === 'eq') {\n hunk.lines.push(` ${o.line}`);\n hunk.aLen++;\n hunk.bLen++;\n aLine++;\n bLine++;\n } else if (o.tag === 'del') {\n hunk.lines.push(`-${o.line}`);\n hunk.aLen++;\n aLine++;\n } else {\n hunk.lines.push(`+${o.line}`);\n hunk.bLen++;\n bLine++;\n }\n idx = k + 1;\n }\n // A hunk that starts at line 1 with zero length should report start 0.\n if (hunk.aLen === 0) hunk.aStart = Math.max(0, hunk.aStart - 1);\n if (hunk.bLen === 0) hunk.bStart = Math.max(0, hunk.bStart - 1);\n hunks.push(hunk);\n }\n return hunks;\n}\n\n/**\n * Count +/− lines in a unified diff. Whole-file create/delete summaries\n * (`+… N lines added …` / `-… N lines deleted …`) use the hunk header for the\n * true line count so the rollup stays accurate when bodies are compacted.\n */\nexport function countDiffStats(diff: string): { added: number; removed: number } {\n if (!diff) return { added: 0, removed: 0 };\n\n const isWholeDelete = /^\\+\\+\\+ \\/dev\\/null$/m.test(diff);\n const isWholeCreate = /^--- \\/dev\\/null$/m.test(diff);\n if (isWholeDelete) {\n const m = diff.match(/@@ -(\\d+)(?:,(\\d+))? \\+0(?:,0)? @@/);\n if (m) {\n const n = m[2] != null ? Number(m[2]) : Number(m[1]) || 0;\n return { added: 0, removed: Number.isFinite(n) ? n : 0 };\n }\n }\n if (isWholeCreate) {\n const m = diff.match(/@@ -0(?:,0)? \\+(\\d+)(?:,(\\d+))? @@/);\n if (m) {\n const n = m[2] != null ? Number(m[2]) : Number(m[1]) || 0;\n return { added: Number.isFinite(n) ? n : 0, removed: 0 };\n }\n }\n\n let added = 0;\n let removed = 0;\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+') && !line.startsWith('+++')) added++;\n else if (line.startsWith('-') && !line.startsWith('---')) removed++;\n }\n return { added, removed };\n}\n\n/** A compact one-line changeset summary: `+adds -dels across N file(s)`. */\nexport function summarizeDiffs(diffs: { file: string; diff: string }[]): string {\n let adds = 0;\n let dels = 0;\n let touched = 0;\n for (const { diff } of diffs) {\n if (!diff) continue;\n touched++;\n const { added, removed } = countDiffStats(diff);\n adds += added;\n dels += removed;\n }\n return `+${adds} -${dels} across ${touched} file(s)`;\n}\n","/**\n * Model backends for `vg code` (VG-CLI-CODE §5).\n *\n * Every backend implements the same {@link Provider} contract, so the router and\n * session are provider-agnostic. Three families:\n * - **local HTTP** — Ollama and LM Studio, reached over `fetch` on localhost;\n * no package, no key, no egress. Selected under `--local`.\n * - **hosted HTTP** — any OpenAI-compatible endpoint (OpenRouter, LiteLLM,\n * Together, a self-hosted gateway, …). One shape covers the \"best in breed\n * router\" story: an ordered model list with automatic fallback lives in the\n * router, not here. Keys come from the environment only and are never logged.\n * - **local inference** — a llama.cpp binding loaded on demand via\n * {@link ensurePackage}; this is the one path that may install a package on\n * first use, and only with consent. Model weights are never auto-downloaded.\n *\n * A deterministic {@link MockProvider} backs the tests, the offline benchmark,\n * and the `--mock` flag, so the whole loop runs end-to-end with no network.\n */\n\nimport { ensurePackage, ensureUnavailableMessage } from './ensure.js';\nimport type { ChatMessage, ChatOptions, Provider, ProviderResult, ReasoningEffort, ToolCall, ToolSpec } from './types.js';\n\n/* ------------------------------------------------------------------ *\\\n * Tool-calling wire helpers (shared by the HTTP providers)\n\\* ------------------------------------------------------------------ */\n\n/** Map our ChatMessage union to OpenAI-compatible wire messages (tool calls included). */\nfunction openAiMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((m) => {\n if (m.role === 'tool') return { role: 'tool', tool_call_id: m.toolCallId, name: m.name, content: m.content };\n if (m.role === 'assistant' && m.toolCalls?.length) {\n return {\n role: 'assistant',\n content: m.content || null,\n tool_calls: m.toolCalls.map((t) => ({ id: t.id, type: 'function', function: { name: t.name, arguments: JSON.stringify(t.arguments) } })),\n };\n }\n // Multimodal user turn → OpenAI content-part array (text + data-URI images).\n if (m.role === 'user' && m.images?.length) {\n return {\n role: 'user',\n content: [\n { type: 'text', text: m.content },\n ...m.images.map((img) => ({\n type: 'image_url',\n image_url: { url: `data:${img.mediaType};base64,${img.dataBase64}` },\n })),\n ],\n };\n }\n return { role: m.role, content: m.content };\n });\n}\n\n/** Ollama's chat shape: images ride as a base64 array on the message itself. */\nfunction ollamaMessages(messages: ChatMessage[]): unknown[] {\n return openAiMessages(messages).map((wire, i) => {\n const m = messages[i];\n if (m.role === 'user' && m.images?.length) {\n return { role: 'user', content: m.content, images: m.images.map((img) => img.dataBase64) };\n }\n return wire;\n });\n}\n\n/** OpenAI-compatible `tools` array from our specs. */\nfunction openAiTools(tools: ToolSpec[] | undefined): unknown[] | undefined {\n if (!tools?.length) return undefined;\n return tools.map((t) => ({ type: 'function', function: { name: t.name, description: t.description, parameters: t.parameters } }));\n}\n\n/** Parse OpenAI-shaped tool_calls, tolerating a malformed arguments string. */\nfunction parseToolCalls(raw: unknown, synthesizePrefix = 'call'): ToolCall[] {\n const calls = raw as { id?: string; function?: { name?: string; arguments?: unknown } }[] | undefined;\n if (!Array.isArray(calls)) return [];\n return calls.map((c, i) => ({\n id: typeof c.id === 'string' && c.id ? c.id : `${synthesizePrefix}_${i}`,\n name: c.function?.name ?? 'unknown',\n arguments: coerceArgs(c.function?.arguments),\n }));\n}\n\nfunction coerceArgs(raw: unknown): Record<string, unknown> {\n if (raw && typeof raw === 'object') return raw as Record<string, unknown>;\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n }\n return {};\n}\n\n/** Redact anything that looks like a credential before it can reach a log/error. */\nexport function redactSecrets(s: string): string {\n return s\n .replace(/\\b(sk|xoxb|ghp|gho|glpat|AKIA)[-_][A-Za-z0-9-_]{6,}/g, '$1-***redacted***')\n .replace(/Bearer\\s+[A-Za-z0-9._-]{8,}/gi, 'Bearer ***redacted***');\n}\n\n/** Common HTTP-completion error shaping: actionable, internals-free (GUARDRAILS §1.3). */\nfunction httpError(label: string, status: number, hint: string): Error {\n return new Error(`${label} returned HTTP ${status} — ${hint}`);\n}\n\n/**\n * The server's own account of what went wrong, when it gave one. An\n * OpenAI-compatible error body is `{ error: { message } }` or `{ error: '…' }`;\n * the Vibgrate Relay adds `detail` (the upstream's verbatim reason) and\n * `correlation_id`. Guessing a hint from the status code alone turns an\n * actionable \"insufficient credits\" or \"no endpoints match your data policy\"\n * into \"check the model id\" — so prefer the body whenever it carries text.\n * Total and defensive: any parse failure just yields null and the caller\n * falls back to its hint.\n */\n/**\n * A `detail` is the upstream's verbatim reason, and upstream reasons are JSON\n * envelopes more often than sentences. Rendered as-is one fills the panel with\n * braces and then gets cut mid-token by the 400-char cap\n * (`\"requested_providers\":[\"goo`), burying the sentence that explains the\n * failure. Lift that sentence out, and spell out the provider lists a routing\n * refusal carries. Total — a non-envelope string comes back untouched, so a\n * plain-prose detail is never mangled.\n */\nexport function unwrapNestedErrorJson(text: string): string {\n const trimmed = (text ?? '').trim();\n if (!trimmed.startsWith('{')) return trimmed;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return trimmed;\n }\n const obj = (parsed ?? {}) as { error?: unknown; message?: unknown };\n const err = obj.error;\n const errObj = (typeof err === 'object' && err ? err : {}) as { message?: unknown; metadata?: unknown };\n const message =\n typeof err === 'string' ? err : typeof errObj.message === 'string' ? errObj.message : typeof obj.message === 'string' ? obj.message : null;\n if (!message?.trim()) return trimmed;\n const metadata = (typeof errObj.metadata === 'object' && errObj.metadata ? errObj.metadata : {}) as {\n requested_providers?: unknown;\n available_providers?: unknown;\n };\n const names = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((v): v is string => typeof v === 'string' && !!v.trim()) : [];\n const requested = names(metadata.requested_providers);\n const available = names(metadata.available_providers);\n const parts = [message.trim()];\n // OpenRouter's own meaning, which is easy to get backwards: `requested` is\n // what the routing was RESTRICTED to, `available` is who actually serves the\n // model. Labelling `available` as \"permitted\" sent debugging the wrong way.\n if (requested.length) parts.push(`routing was restricted to: ${requested.join(', ')}`);\n if (available.length) parts.push(`this model is served by: ${available.join(', ')}`);\n return parts.join(' — ');\n}\n\nexport function relayErrorDetail(body: string): string | null {\n if (!body) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return nonJsonErrorDetail(body);\n }\n const obj = parsed as { error?: unknown; detail?: unknown; message?: unknown; correlation_id?: unknown };\n const err = obj?.error;\n const errObj = (typeof err === 'object' && err ? err : {}) as { message?: unknown; detail?: unknown; correlation_id?: unknown };\n const message =\n typeof err === 'string'\n ? err\n : typeof errObj.message === 'string'\n ? errObj.message\n : typeof obj?.message === 'string'\n ? obj.message\n : null;\n const detailValue = typeof obj?.detail === 'string' ? obj.detail : typeof errObj.detail === 'string' ? errObj.detail : null;\n const detail = detailValue && detailValue.trim() ? unwrapNestedErrorJson(detailValue) : null;\n const parts = [message, detail].filter((p): p is string => !!p && p.trim().length > 0);\n if (!parts.length) return null;\n const correlationId = typeof obj?.correlation_id === 'string' && obj.correlation_id\n ? obj.correlation_id\n : typeof errObj.correlation_id === 'string' && errObj.correlation_id\n ? errObj.correlation_id\n : null;\n const id = correlationId ? ` (correlation id ${correlationId})` : '';\n return `${[...new Set(parts)].join(' — ').slice(0, 400)}${id}`;\n}\n\n/**\n * A non-JSON body — an HTML error page from a CDN or proxy sitting in front of\n * the endpoint, a plain-text proxy notice. A short one is still more\n * informative than nothing; a long one is noise EXCEPT for its `<title>`\n * (\"502 Bad Gateway\", \"Worker threw exception\"), which is the whole story.\n * Without that salvage the caller falls back to a status-code guess and blames\n * the model id for what is really an infrastructure failure.\n */\nfunction nonJsonErrorDetail(body: string): string | null {\n const text = body.trim();\n if (!text) return null;\n if (text.length <= 200) return text;\n const title = /<title[^>]*>([\\s\\S]*?)<\\/title>/i.exec(text)?.[1]?.replace(/\\s+/g, ' ').trim();\n if (title) return title.slice(0, 200);\n // Cloudflare renders its worker/gateway failures as \"Error 1101\"-style codes.\n const code = /\\bError\\s+\\d{3,4}\\b/.exec(text)?.[0];\n return code ?? null;\n}\n\n/**\n * What to suggest for a failing status when the server said nothing useful.\n * A gateway status (502/503/504) means the request never reached the model, or\n * never came back from it — the model id is not the suspect there, and saying\n * it is sends people editing a `--model` flag that was correct all along.\n */\nexport function statusHint(status: number, model: string, apiKeyEnv: string | undefined): string {\n if (status === 401 || status === 403) return `the key in ${apiKeyEnv ?? '(none)'} was rejected — check it has access to \"${model}\"`;\n if (status === 402) return 'the account behind this endpoint is out of credit — top it up, or switch backend with --provider / --local';\n if (status === 404) return `this endpoint has no model \"${model}\" — check the id (\\`vg models catalog\\`) and the base URL`;\n if (status === 408 || status === 504) return 'the request timed out before the model replied — retry, shorten the task, or use --local';\n if (status === 429) return 'rate limited — wait and retry, or switch backend with --provider / --local';\n if (status >= 500) return `the endpoint failed to serve the request — this is an upstream/gateway failure, not the model id \"${model}\"; retry, or use --provider / --local if it persists`;\n return `check the model id \"${model}\" and the endpoint`;\n}\n\n/** Yield newline-delimited lines from a streamed response body. */\nasync function* streamLines(res: Response): AsyncGenerator<string> {\n const reader = res.body?.getReader();\n if (!reader) return;\n const decoder = new TextDecoder();\n let buf = '';\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (line) yield line;\n }\n }\n if (buf.trim()) yield buf.trim();\n}\n\n/**\n * Read a `--reasoning-effort` / host-supplied value into the neutral enum.\n * Anything unrecognised (including an absent flag) is undefined — an unknown\n * level must not be forwarded to the provider, where it would be a 400 rather\n * than the \"think normally\" the user meant.\n */\nexport function parseReasoningEffort(raw: unknown): ReasoningEffort | undefined {\n const v = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n return v === 'low' || v === 'medium' || v === 'high' ? v : undefined;\n}\n\n/** Accumulator shape for {@link accumulateOpenAiDelta}. */\nexport interface OpenAiStreamAcc {\n text: string;\n /** Reasoning channel, kept out of `text` so a host can collapse it. */\n reasoning: string;\n tools: Map<number, { id?: string; name?: string; args: string }>;\n usage: { promptTokens?: number; completionTokens?: number; cachedPromptTokens?: number };\n /** Last non-null `finish_reason` seen — 'length' means the cap cut the reply. */\n finishReason?: string;\n}\n\n/** A fresh accumulator (one per request). */\nexport function newOpenAiStreamAcc(): OpenAiStreamAcc {\n return { text: '', reasoning: '', tools: new Map(), usage: {} };\n}\n\n/**\n * Prompt tokens the endpoint served from cache, under either spelling in the\n * wild: OpenAI/OpenRouter nest it as `prompt_tokens_details.cached_tokens`,\n * some proxies flatten it to `cached_tokens`. Returns undefined when the\n * provider is silent — a missing number must never be read as \"nothing cached\".\n */\nexport function cachedPromptTokensOf(usage: unknown): number | undefined {\n const u = usage as { prompt_tokens_details?: { cached_tokens?: unknown }; cached_tokens?: unknown } | null;\n const raw = u?.prompt_tokens_details?.cached_tokens ?? u?.cached_tokens;\n return typeof raw === 'number' && Number.isFinite(raw) && raw >= 0 ? raw : undefined;\n}\n\n/** Accumulate an OpenAI-compatible SSE stream into text + tool calls + usage. */\nexport function accumulateOpenAiDelta(\n acc: OpenAiStreamAcc,\n chunk: unknown,\n onToken?: (t: string) => void,\n onReasoningToken?: (t: string) => void,\n): void {\n const c = chunk as { choices?: { delta?: { content?: string; reasoning?: string; reasoning_content?: string; tool_calls?: { index?: number; id?: string; function?: { name?: string; arguments?: string } }[] }; finish_reason?: string | null }[]; usage?: { prompt_tokens?: number; completion_tokens?: number } };\n const reason = c.choices?.[0]?.finish_reason;\n if (typeof reason === 'string' && reason) acc.finishReason = reason;\n const delta = c.choices?.[0]?.delta;\n if (delta?.content) {\n acc.text += delta.content;\n onToken?.(delta.content);\n }\n // Reasoning arrives under `reasoning` (OpenRouter) or `reasoning_content`\n // (DeepSeek-style). Both are the same channel; never fold into `text`.\n const think = delta?.reasoning ?? delta?.reasoning_content;\n if (typeof think === 'string' && think) {\n acc.reasoning += think;\n onReasoningToken?.(think);\n }\n for (const tc of delta?.tool_calls ?? []) {\n const idx = tc.index ?? 0;\n const e = acc.tools.get(idx) ?? { args: '' };\n if (tc.id) e.id = tc.id;\n if (tc.function?.name) e.name = tc.function.name;\n if (tc.function?.arguments) e.args += tc.function.arguments;\n acc.tools.set(idx, e);\n }\n if (c.usage) {\n acc.usage.promptTokens = c.usage.prompt_tokens;\n acc.usage.completionTokens = c.usage.completion_tokens;\n const cached = cachedPromptTokensOf(c.usage);\n if (cached !== undefined) acc.usage.cachedPromptTokens = cached;\n }\n}\n\n/** Turn accumulated OpenAI tool-call fragments into ToolCalls. */\nfunction finalizeTools(tools: Map<number, { id?: string; name?: string; args: string }>): ToolCall[] {\n return [...tools.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([i, e]) => ({ id: e.id ?? `call_${i}`, name: e.name ?? 'unknown', arguments: coerceArgs(e.args) }));\n}\n\nasync function postJson(url: string, body: unknown, headers: Record<string, string>, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { method: 'POST', headers: { 'content-type': 'application/json', ...headers }, body: JSON.stringify(body), signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * Deterministic mock (tests / offline / --mock)\n\\* ------------------------------------------------------------------ */\n\n/**\n * A provider that returns a fixed, scripted reply — the deterministic floor that\n * lets the entire `vg code` loop run offline. Used by tests, the benchmark, and\n * the `--mock` flag (which reads the scripted edit blocks from a file).\n */\nexport class MockProvider implements Provider {\n readonly id = 'mock';\n readonly label = 'Mock (deterministic)';\n readonly local = true;\n constructor(\n readonly model: string,\n private readonly reply: string,\n ) {}\n async chat(_messages?: ChatMessage[], _opts?: ChatOptions): Promise<ProviderResult> {\n return { text: this.reply, model: this.model, provider: this.id };\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * Ollama (local, no key)\n\\* ------------------------------------------------------------------ */\n\nexport class OllamaProvider implements Provider {\n readonly id = 'ollama';\n readonly label = 'Ollama (local)';\n readonly local = true;\n constructor(\n readonly model: string,\n private readonly host = process.env.OLLAMA_HOST || 'http://127.0.0.1:11434',\n ) {}\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const streaming = !!(opts.stream && opts.onToken);\n let res: Response;\n try {\n res = await postJson(\n `${this.host.replace(/\\/$/, '')}/api/chat`,\n { model: this.model, messages: ollamaMessages(messages), stream: streaming, tools: openAiTools(opts.tools), options: { temperature: opts.temperature ?? 0 } },\n {},\n opts.timeoutMs ?? 120_000,\n );\n } catch {\n throw new Error(`couldn't reach Ollama at ${this.host} — is \\`ollama serve\\` running? (start it, or pass --provider to use a different backend)`);\n }\n if (!res.ok) throw httpError('Ollama', res.status, res.status === 404 ? `model \"${this.model}\" isn't pulled — run \\`ollama pull ${this.model}\\` or pick another with --model` : 'check `ollama serve` and the model name');\n\n if (streaming) {\n let text = '';\n let reasoning = '';\n let toolCallsRaw: unknown;\n let truncated = false;\n const usage: { promptTokens?: number; completionTokens?: number } = {};\n for await (const line of streamLines(res)) {\n try {\n const obj = JSON.parse(line) as { message?: { content?: string; thinking?: string; tool_calls?: unknown }; prompt_eval_count?: number; eval_count?: number; done_reason?: string };\n const delta = obj.message?.content;\n if (delta) {\n text += delta;\n opts.onToken?.(delta);\n }\n // Ollama spells the reasoning channel `thinking`. Only thinking-capable\n // models send it — we read it when offered and never request it, since\n // asking a plain model to `think` is a 400 from the server.\n const think = obj.message?.thinking;\n if (think) {\n reasoning += think;\n opts.onReasoningToken?.(think);\n }\n if (obj.message?.tool_calls) toolCallsRaw = obj.message.tool_calls;\n if (typeof obj.prompt_eval_count === 'number') usage.promptTokens = obj.prompt_eval_count;\n if (typeof obj.eval_count === 'number') usage.completionTokens = obj.eval_count;\n // Ollama's spelling of finish_reason: 'length' means num_predict cut it.\n if (obj.done_reason === 'length') truncated = true;\n } catch {\n /* skip a malformed line */\n }\n }\n return { text, model: this.model, provider: this.id, toolCalls: parseToolCalls(toolCallsRaw), usage, ...(reasoning ? { reasoning } : {}), truncated };\n }\n\n const data = (await res.json()) as { message?: { content?: string; thinking?: string; tool_calls?: unknown }; prompt_eval_count?: number; eval_count?: number; done_reason?: string };\n return {\n text: data.message?.content ?? '',\n model: this.model,\n provider: this.id,\n toolCalls: parseToolCalls(data.message?.tool_calls),\n usage: { promptTokens: data.prompt_eval_count, completionTokens: data.eval_count },\n ...(data.message?.thinking ? { reasoning: data.message.thinking } : {}),\n truncated: data.done_reason === 'length',\n };\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * OpenAI-compatible (LM Studio, OpenRouter, LiteLLM, …)\n\\* ------------------------------------------------------------------ */\n\nexport interface OpenAiCompatibleConfig {\n /** Base URL, e.g. `https://openrouter.ai/api/v1` or `http://127.0.0.1:1234/v1`. */\n baseUrl: string;\n /** Env var name holding the API key (never the key itself). Absent for local. */\n apiKeyEnv?: string;\n /** Whether this endpoint is on-device (LM Studio) vs hosted. */\n local: boolean;\n /** Display label. */\n label: string;\n id: string;\n}\n\nexport class OpenAiCompatibleProvider implements Provider {\n readonly id: string;\n readonly label: string;\n readonly local: boolean;\n constructor(\n readonly model: string,\n private readonly config: OpenAiCompatibleConfig,\n ) {\n this.id = config.id;\n this.label = config.label;\n this.local = config.local;\n }\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const headers: Record<string, string> = {};\n if (this.config.apiKeyEnv) {\n const key = process.env[this.config.apiKeyEnv];\n if (!key) {\n throw new Error(`${this.label} needs an API key in ${this.config.apiKeyEnv} — set it in your environment (never pass keys as flags), or use --local for an on-device backend.`);\n }\n headers.authorization = `Bearer ${key}`;\n }\n const streaming = !!(opts.stream && opts.onToken);\n const url = `${this.config.baseUrl.replace(/\\/$/, '')}/chat/completions`;\n const body = {\n model: this.model,\n messages: openAiMessages(messages),\n tools: openAiTools(opts.tools),\n temperature: opts.temperature ?? 0,\n max_tokens: opts.maxTokens,\n stream: streaming,\n ...(streaming ? { stream_options: { include_usage: true } } : {}),\n // Both spellings ride along: OpenAI reads `reasoning_effort`, OpenRouter\n // reads `reasoning.effort`. Endpoints ignore fields they don't know, so\n // sending both is cheaper than sniffing the backend — and a model with\n // no reasoning knob is unaffected either way.\n ...(opts.reasoningEffort\n ? { reasoning_effort: opts.reasoningEffort, reasoning: { effort: opts.reasoningEffort } }\n : {}),\n };\n let res: Response;\n try {\n res = await postJson(url, body, headers, opts.timeoutMs ?? 120_000);\n } catch {\n throw new Error(`couldn't reach ${this.label} at ${this.config.baseUrl} — check the endpoint is up (or use --local).`);\n }\n if (!res.ok) {\n const detail = relayErrorDetail(await res.text().catch(() => ''));\n const hint = detail ?? statusHint(res.status, this.model, this.config.apiKeyEnv);\n throw httpError(this.label, res.status, hint);\n }\n\n if (streaming) {\n const acc = newOpenAiStreamAcc();\n for await (const line of streamLines(res)) {\n if (!line.startsWith('data:')) continue;\n const payload = line.slice(5).trim();\n if (payload === '[DONE]') break;\n try {\n accumulateOpenAiDelta(acc, JSON.parse(payload), opts.onToken, opts.onReasoningToken);\n } catch {\n /* skip a malformed chunk */\n }\n }\n const tools = finalizeTools(acc.tools);\n return {\n text: acc.text,\n model: this.model,\n provider: this.id,\n toolCalls: tools.length ? tools : undefined,\n usage: acc.usage,\n ...(acc.reasoning ? { reasoning: acc.reasoning } : {}),\n truncated: acc.finishReason === 'length',\n };\n }\n const data = (await res.json()) as { choices?: { message?: { content?: string; reasoning?: string; reasoning_content?: string; tool_calls?: unknown }; finish_reason?: string | null }[]; usage?: { prompt_tokens?: number; completion_tokens?: number } };\n const message = data.choices?.[0]?.message;\n const reasoning = message?.reasoning ?? message?.reasoning_content;\n return {\n text: message?.content ?? '',\n model: this.model,\n provider: this.id,\n toolCalls: parseToolCalls(message?.tool_calls),\n usage: {\n promptTokens: data.usage?.prompt_tokens,\n completionTokens: data.usage?.completion_tokens,\n ...(cachedPromptTokensOf(data.usage) !== undefined\n ? { cachedPromptTokens: cachedPromptTokensOf(data.usage) }\n : {}),\n },\n ...(reasoning ? { reasoning } : {}),\n truncated: data.choices?.[0]?.finish_reason === 'length',\n };\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * Scripted provider (agent-loop tests / offline demos)\n\\* ------------------------------------------------------------------ */\n\n/**\n * Returns a queued sequence of {@link ProviderResult}s — one per turn — so the\n * agentic loop can be driven deterministically offline: script the tool calls\n * the \"model\" makes (read → search → edit → run → finish) and assert what the\n * agent did. Ignores the incoming messages by design.\n */\nexport class ScriptedProvider implements Provider {\n readonly id = 'scripted';\n readonly label = 'Scripted (deterministic)';\n readonly local = true;\n private turn = 0;\n /** Options the last `chat` was called with — lets tests assert what was forwarded. */\n lastOpts?: ChatOptions;\n constructor(\n readonly model: string,\n private readonly steps: Array<{\n text?: string;\n toolCalls?: ToolCall[];\n truncated?: boolean;\n /** Reasoning channel for this step (v5), as a thinking model would send. */\n reasoning?: string;\n usage?: ProviderResult['usage'];\n }>,\n ) {}\n // Match Provider.chat so tests can wrap/spy with the full signature.\n async chat(_messages?: ChatMessage[], _opts?: ChatOptions): Promise<ProviderResult> {\n const step = this.steps[Math.min(this.turn, this.steps.length - 1)];\n this.turn++;\n this.lastOpts = _opts;\n // Stream the scripted reasoning the way a real backend does, so the agent's\n // thinking path is exercised end-to-end and not just its non-stream branch.\n if (step.reasoning && _opts?.stream) _opts.onReasoningToken?.(step.reasoning);\n return {\n text: step.text ?? '',\n model: this.model,\n provider: this.id,\n toolCalls: step.toolCalls,\n ...(step.reasoning ? { reasoning: step.reasoning } : {}),\n ...(step.usage ? { usage: step.usage } : {}),\n truncated: step.truncated,\n };\n }\n}\n\n/** The catalogue of known OpenAI-compatible endpoints, keyed by short id. */\nexport const OPENAI_COMPATIBLE: Record<string, Omit<OpenAiCompatibleConfig, 'label' | 'id'> & { label: string }> = {\n /**\n * Vibgrate Relay — the first-party hosted router. OpenAI-compatible, so it\n * needs no bespoke client. Reached with a Vibgrate token rather than a\n * provider key; the base URL is overridable for staging and self-hosting.\n */\n 'vibgrate-relay': {\n baseUrl: process.env.VIBGRATE_RELAY_URL || 'https://api.vibgrate.com/relay/v1',\n apiKeyEnv: 'VIBGRATE_RELAY_TOKEN',\n local: false,\n label: 'Vibgrate Relay',\n },\n openrouter: { baseUrl: 'https://openrouter.ai/api/v1', apiKeyEnv: 'OPENROUTER_API_KEY', local: false, label: 'OpenRouter' },\n litellm: { baseUrl: process.env.LITELLM_BASE_URL || 'http://127.0.0.1:4000', apiKeyEnv: 'LITELLM_API_KEY', local: false, label: 'LiteLLM' },\n openai: { baseUrl: 'https://api.openai.com/v1', apiKeyEnv: 'OPENAI_API_KEY', local: false, label: 'OpenAI' },\n together: { baseUrl: 'https://api.together.xyz/v1', apiKeyEnv: 'TOGETHER_API_KEY', local: false, label: 'Together' },\n /**\n * VS Code language models (Copilot Chat etc.) via the extension's loopback\n * OpenAI-compatible proxy. Base URL is injected as VSCODE_LM_BASE_URL at spawn.\n */\n 'vscode-lm': {\n baseUrl: process.env.VSCODE_LM_BASE_URL || 'http://127.0.0.1:0/v1',\n local: true,\n label: 'VS Code Language Model',\n },\n lmstudio: { baseUrl: process.env.LMSTUDIO_BASE_URL || 'http://127.0.0.1:1234/v1', local: true, label: 'LM Studio (local)' },\n /**\n * Microsoft Foundry Local — OpenAI-compatible local endpoint (Windows NPU/GPU).\n * Default port matches current Foundry Local docs; override with FOUNDRY_LOCAL_BASE_URL.\n */\n 'foundry-local': {\n baseUrl: process.env.FOUNDRY_LOCAL_BASE_URL || 'http://127.0.0.1:5272/v1',\n local: true,\n label: 'Foundry Local',\n },\n};\n\n/* ------------------------------------------------------------------ *\\\n * Local llama.cpp (installs a package on first use, with consent)\n\\* ------------------------------------------------------------------ */\n\n/**\n * A fully-local inference backend backed by the dual-mode llm-host (ADR-005)\n * and `node-llama-cpp`. Install runtime deps via `vg models install` (or pass\n * consent so ensurePackage can run once). Model *weights* are never fetched\n * automatically: `modelPath` must point at a gguf the user already has.\n */\nexport class LocalLlamaProvider implements Provider {\n readonly id = 'llama-cpp';\n /** Surfaced as the Vibgrate model manager (embedded llama.cpp). */\n readonly label = 'Vibgrate (local)';\n readonly local = true;\n /**\n * The embedded host has no native function-calling API — the router wraps\n * this provider in the text tool protocol (text-tool-protocol.ts) so the\n * agent loop still gets structured tool calls.\n */\n readonly supportsTools = false;\n /** Process-wide warm binding + path (best-in-breed: no reload per turn). */\n private static warmBinding: unknown | null = null;\n private static warmHost: import('../runtime/llm-host/embedded.js').EmbeddedLlmHost | null = null;\n private static warmPath: string | null = null;\n\n constructor(\n readonly model: string,\n private readonly modelPath: string,\n private readonly ensure: typeof ensurePackage = ensurePackage,\n private readonly consent = false,\n /** Override isolation (default: env / embedded). */\n private readonly isolation: 'embedded' | 'process' = 'embedded',\n private readonly processEndpoint?: string,\n ) {}\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const {\n createLlmHost,\n EmbeddedLlmHost,\n resolveInferenceIsolation,\n acquireHostSession,\n generateOnSession,\n evictIdleSessions,\n } = await import('../runtime/llm-host/index.js');\n const isolation = resolveInferenceIsolation(this.isolation);\n try {\n const chatMessages = messages.map((m) => ({\n role: (m.role === 'tool' ? 'user' : m.role) as 'system' | 'user' | 'assistant',\n content: m.content,\n }));\n const genOpts = {\n temperature: opts.temperature ?? 0,\n maxTokens: opts.maxTokens,\n grammar: opts.grammar,\n requireGrammar: opts.requireGrammar,\n identifierTrie: opts.identifierTrie,\n annotateUnknownIdentifiers: !!opts.identifierTrie,\n draftCandidates: opts.draftCandidates,\n promptSegments: opts.promptSegments,\n };\n\n if (isolation === 'process') {\n const host = createLlmHost({ isolation: 'process', endpoint: this.processEndpoint });\n await host.load(this.modelPath);\n const out = await host.generate(chatMessages, genOpts);\n return { text: out.text, model: this.model, provider: this.id };\n }\n\n // Warm path: reuse binding + session across turns.\n if (!LocalLlamaProvider.warmBinding) {\n const res = await this.ensure('node-llama-cpp@^3', { consent: this.consent, onUnavailable: () => {} });\n if (!res.module) {\n throw new Error(ensureUnavailableMessage(res.reason ?? 'no-consent', 'node-llama-cpp', res.detail));\n }\n LocalLlamaProvider.warmBinding = res.module;\n }\n evictIdleSessions(2);\n\n // Prefer direct session API for metrics-rich generate.\n const session = await acquireHostSession(LocalLlamaProvider.warmBinding, this.modelPath);\n const report = await generateOnSession(session, chatMessages, genOpts);\n // Real-ish usage for the panel meter. Never report draftAcceptedChars as\n // tokens — that is a char count of a speculative draft, not model usage\n // (it produced footers like \"56 tokens\" for multi-paragraph answers).\n const promptTokens = report.kvPlan?.totalTokens;\n const completionTokens = report.text ? Math.max(1, Math.ceil(report.text.length / 4)) : undefined;\n return {\n text: report.text,\n model: this.model,\n provider: this.id,\n usage: {\n ...(typeof promptTokens === 'number' && promptTokens > 0 ? { promptTokens } : {}),\n ...(completionTokens != null ? { completionTokens } : {}),\n },\n };\n } catch (e) {\n // Fall back to EmbeddedLlmHost once if session path fails.\n try {\n if (LocalLlamaProvider.warmBinding) {\n if (\n !LocalLlamaProvider.warmHost ||\n LocalLlamaProvider.warmPath !== this.modelPath\n ) {\n const host = createLlmHost({\n isolation: 'embedded',\n binding: LocalLlamaProvider.warmBinding,\n preferGrammar: !!opts.grammar,\n });\n if (host instanceof EmbeddedLlmHost) {\n LocalLlamaProvider.warmHost = host;\n LocalLlamaProvider.warmPath = this.modelPath;\n await host.load(this.modelPath);\n }\n }\n if (LocalLlamaProvider.warmHost) {\n const out = await LocalLlamaProvider.warmHost.generate(\n messages.map((m) => ({\n role: (m.role === 'tool' ? 'user' : m.role) as 'system' | 'user' | 'assistant',\n content: m.content,\n })),\n {\n temperature: opts.temperature ?? 0,\n maxTokens: opts.maxTokens,\n grammar: opts.grammar,\n requireGrammar: opts.requireGrammar,\n identifierTrie: opts.identifierTrie,\n annotateUnknownIdentifiers: !!opts.identifierTrie,\n draftCandidates: opts.draftCandidates,\n promptSegments: opts.promptSegments,\n },\n );\n return { text: out.text, model: this.model, provider: this.id };\n }\n }\n } catch {\n /* rethrow outer */\n }\n throw new Error(`local llama.cpp inference failed for ${this.modelPath} — ${redactSecrets((e as Error).message)}`);\n }\n }\n}\n"]}